深入AES加密核心:对称密码的现代守护者

免责声明:用户因使用公众号内容而产生的任何行为和后果,由用户自行承担责任。本公众号不承担因用户误解、不当使用等导致的法律责任


目录

一:分组密码的填充方式

1. PKCS#7/PKCS#5

2. ANSI X.923

3. ISO 10126

4. 补零填充

5. 无填充

示例场景

二:分组密码的工作模式

1. ECB(电子密码本模式)

2. CBC(密码块链接模式)

3. CFB(密码反馈模式)

4. OFB(输出反馈模式)

5. CTR(计数器模式)

三:AES

​编辑

1. 基本概述

2. 核心特性

3.AES加密流程

密钥扩展(Key Expansion)

初始轮密钥加(AddRoundKey)

最终轮(第10轮)

输出密文块

7.python代码

四:总结


一:分组密码的填充方式

1. PKCS#7/PKCS#5

  • 原理:填充值为需填充的字节数。例如,若块大小为8字节,需填充3字节,则填充0x03 0x03 0x03

  • 特点

    • PKCS#5专为8字节块设计(如DES),PKCS#7支持1-255字节块(如AES)。

    • 数据长度恰好为块大小时,填充完整新块(如16字节块填充16个0x10)。

  • 应用:广泛用于SSL/TLS、CMS等协议,兼容性强。


2. ANSI X.923

  • 原理:填充字节的末字节为填充长度,其余为0x00。例如,填充3字节则为0x00 0x00 0x03

  • 特点:解密时校验填充字节前部分是否为0x00,否则报错,增强安全性。

  • 应用:部分金融或旧系统标准中可能要求。


3. ISO 10126

  • 原理:末字节为填充长度,其余为随机数。例如,填充3字节可能为0xAB 0xCD 0x03

  • 特点:随机填充增加密文随机性,减少攻击面,但需注意该标准已撤销。

  • 应用:曾用于需高随机性的场景,现逐渐被替代。


4. 补零填充

  • 原理:填充0x00至块大小。例如,需填充3字节则为0x00 0x00 0x00

  • 缺点:若原始数据以0x00结尾,解密时无法区分填充与数据,需额外长度信息。

  • 应用:适用于数据本身不含0x00或协议明确处理长度的情况。


5. 无填充

  • 条件:数据长度必须为块大小的整数倍。

  • 应用:结合流模式(如CTR、OFB)或固定长度数据(如哈希值)。


示例场景

  1. AES-CBC加密:使用PKCS#7填充,处理任意长度数据。

  2. DES加密:PKCS#5填充,兼容8字节块。

  3. 固定长度令牌:无需填充,直接加密。


方式描述
NoPadding不填充
补零填充填充 0
ANSI X9.23最后一位填长度,其余填充 0
ISO10126最后一位填长度,其余填充随机内容
PKCS5 和 PKCS7PKCS5 Padding—— 块大小 8 个字节
PKCS7 Padding—— 块大小 1~255

二:分组密码的工作模式

1. ECB(电子密码本模式)

  • 原理每个明文块独立加密,相同明文块生成相同密文块。

  • 特点

    • 优点:简单、无需初始化向量(IV),支持并行加解密。

    • 缺点

      • 相同明文生成相同密文,容易被破解。

      • 无法抵御重放攻击。

  • 应用场景:仅适用于加密单个数据块(如密钥加密),不推荐用于批量数据。


2. CBC(密码块链接模式)

  • 原理

    • 每个明文块与前一个密文块异或后再加密,首个块使用随机IV。

    • 解密时,先解密再与前一个密文块异或得到明文

    • 支持解密并行

  • 特点

    • 优点:相同明文生成不同密文,隐藏数据模式。当一个数据块损坏时,不影响其他数据块界面,只影响它周围的2个数据块

    • 缺点

      • 需要填充(如PKCS#7),错误传播影响后续两个块。

      • 必须保证IV唯一且不可预测,否则可能被攻击。

      • 加密不支持并行

  • 应用场景:文件加密、早期SSL/TLS协议。


3. CFB(密码反馈模式)

  • 原理

    • 将分组密码转换为自同步流密码

    • 前一个密文块加密后与明文异或生成密文,支持逐比特加密

    • 可并行解密

    • 解密:利用异或运算的可逆性,利用前一个密文块加密后和现密文块进行异或解密

  • 特点

    • 优点:无需填充,支持实时处理。

    • 缺点

      • 错误传播:单个密文错误影响后续多个比特(取决于反馈位数)。

      • 需要随机IV。

      • 不支持并行加密

  • 应用场景:流式数据传输(如实时通信)。

  • 与CBC区别:CBC先异或在加密而CFB先加密在异或,CFB不需要填充而CBC需要

CFB加密:

CFB解密:


4. OFB(输出反馈模式)

  • 原理

    • 生成密钥流(与明文无关),与明文异或生成密文。

    • 密钥流通过迭代加密IV产生

  • 特点

    • 优点:无错误传播,适合高噪声信道。

    • 缺点

      • 密钥流不可重复(否则导致安全性问题)。

      • 需要随机IV。

      • 不支持并行加解密

  • 应用场景:卫星通信、需要抗干扰的场景。

OFB加密:

OFB解密:


5. CTR(计数器模式)

  • 原理

    • 使用递增的计数器值加密生成密钥流,与明文异或。

    • 计数器可以是随机数(Nonce)与块序号组合。

  • 特点

    • 优点

      • 无填充、支持并行加密/解密。

      • 错误不传播,高效适合硬件加速。

    • 缺点:必须确保计数器唯一,否则密钥流重复导致明文泄露。

  • 应用场景:网络协议(如IPSec、Wi-Fi加密)、高性能需求场景。

CTR加密:

CRT解密:


如何选择

  1. 安全性优先:选择认证加密模式(如GCM、CCM)。

  2. 性能需求:CTR或GCM模式适合高速加密。

  3. 兼容性:CBC仍广泛支持但需注意填充Oracle攻击防护。

  4. 错误容忍:OFB或CTR适用于易出错环境。

  5. 避免使用:ECB(除非加密单个块)。


对比内容ECBCBCCFBOFBCTR
工作方式直接加密明文分组对明文分组与前一个明文分组的异或结果加密先加密前一个密文再与明文异或先生成密钥流再与明文异或将计数器加密后再与明文分组异或
需要填充×××
加密并行×××
解密并行×
密文错误解密影响当前明文当前和下一个当前和下一个当前明文当前明文
用途传送短数据传送数据分组;认证传送数据分组;认证有扰信道传送数据
流密码××

三:AES

         (图片来源:么是AES加密?详解AES加密算法原理流程 - 知乎)


1. 基本概述


AES(Advanced Encryption Standard)是一种对称加密算法,于2001年被美国国家标准与技术研究院(NIST)正式采用,取代了旧的DES(数据加密标准)。它由比利时密码学家Joan Daemen和Vincent Rijmen设计,原名Rijndael算法


2. 核心特性

  • 密钥长度:支持128位、192位、256位三种密钥,对应不同安全级别。

  • 分组大小:固定128位(16字节)的数据块。

  • 加密轮数:根据密钥长度决定轮数(10/12/14轮),每轮包含非线性变换、行移位、列混淆和轮密钥加等操作。

3.AES加密流程

  1. 密钥扩展(Key Expansion)
    • 将128位主密钥扩展为11个128位轮密钥(首轮密钥为原始密钥,后续10轮通过算法生成)。

  2. 初始轮密钥加(AddRoundKey)
    • 明文块与第1个轮密钥进行异或操作。(将16个字节明文变为4*4的矩阵,子密钥16个的字节也变为矩阵k1与p1异或以此类推得到如下矩阵

      P1⊕K1P2⊕K2P3⊕K3P4⊕K4
      P5⊕K5P6⊕K6P7⊕K7P8⊕K8
      p 9 ⊕K9P10⊕K10P11⊕K11P12⊕K12
      p13⊕ k13 P14⊕K14P15⊕K15p16 页⊕K16

  3. 主轮处理(10轮循环)
    每轮依次执行以下操作:

    • 字节代换(SubBytes):利用异或后的表格对照s盒进行替换(就是简单的替换)。

      D4

      e0

      b 8

      1e

      27

      Bf

      b 4

      41

      11

      98

      5d

      52

      Ae

      F1

      E5

      30

      将如上经过初始轮秘钥加得到的表格对照s盒进行替换(比如d列4行以此类推)

    • 行移位(ShiftRows):将字节代换后的表格进行行移位。

      行号描述
      第一行保持不变
      第二行向左移动 1 个字节
      第三行向左移动 2 个字节
      第四行

      向左移动 3 个字节

      例如以字帖替换表为例行变后如左表)

    • 列混淆(MixColumns):将行移位后的表格与设定的表格进行左乘

      | 02 03 01 01 |
      | 01 02 03 01 |
      | 01 01 02 03 |   (左乘)   行移位后表
      | 03 01 01 02 |

    • 轮密钥加(AddRoundKey):将列混合后的矩阵与本轮子密钥进行异或(参考:初始轮密钥加)


  4. 最终轮(第10轮)
    • 跳过列混淆操作(仅执行SubBytes→ShiftRows→AddRoundKey)。

  5. 输出密文块
    • 最终得到128位密文块,所有块处理完成后拼接为完整密文。


6.子秘钥扩展算法

W₀ = [k₀, k₁, k₂, k₃]  
W₁ = [k₄, k₅, k₆, k₇]  
W₂ = [k₈, k₉, k₁₀, k₁₁]    初始子密钥
W₃ = [k₁₂, k₁₃, k₁₄, k₁₅]  
条件等式确定规则示例
i 不是 4 的倍数W[i]=W[i - 4]⊕W[i - 1]W5=W1⊕W4 ;W6=W2⊕W5
i 是 4 的倍数W[i]=W[i - 4]⊕T(W[i - 1])W4=W0⊕T(W3)

i是4的倍数如下(T函数)

1.字循环

将前一个字循环左移1字节(例如,[k0,k1,k2,k3 → [k3,k0,k1,k2])。

2.字节替换

对字循环的结果使用s盒进行字节替换

3.轮常量异或

将前面的结果与轮常量进行异或,第一轮使用第一列轮常量,以此类推

最后将第一轮轮常量异或结果与w0进行异或就得到w4


7.python代码

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
import base64

# 加密函数
def aes_encrypt(plaintext, key):
    # 将明文转换为字节
    plaintext = plaintext.encode('utf-8')
    
    # 生成随机初始化向量 (IV)
    iv = get_random_bytes(AES.block_size)
    
    # 创建 AES-CBC 加密器
    cipher = AES.new(key, AES.MODE_CBC, iv)
    
    # 填充并加密数据
    ciphertext = cipher.encrypt(pad(plaintext, AES.block_size))
    
    # 组合 IV 和密文,并用 Base64 编码
    encrypted_data = base64.b64encode(iv + ciphertext).decode('utf-8')
    
    return encrypted_data

# 解密函数
def aes_decrypt(encrypted_data, key):
    # Base64 解码
    encrypted_data = base64.b64decode(encrypted_data)
    
    # 提取 IV 和密文
    iv = encrypted_data[:AES.block_size]
    ciphertext = encrypted_data[AES.block_size:]
    
    # 创建 AES-CBC 解密器
    cipher = AES.new(key, AES.MODE_CBC, iv)
    
    # 解密并去除填充
    plaintext = unpad(cipher.decrypt(ciphertext), AES.block_size)
    
    return plaintext.decode('utf-8')

# 示例用法
if __name__ == "__main__":
    # 生成随机 AES 密钥(支持 16/24/32 字节对应 AES-128/AES-192/AES-256)
    key = get_random_bytes(32)  # 使用 AES-256
    
    # 原始文本
    text = "Hello, AES 加密测试!"
    
    # 加密
    encrypted = aes_encrypt(text, key)
    print("加密结果:", encrypted)
    
    # 解密
    decrypted = aes_decrypt(encrypted, key)
    print("解密结果:", decrypted)

四:总结

对比维度AESRC4DES
算法类型分组密码(固定128位分组)流密码(逐字节加密)分组密码(固定64位分组)
密钥长度128/192/256位40-2048位(通常40-256位)56位(实际64位,含8位校验)
安全性高(抗差分/线性攻击,现代标准)低(已被证明存在多漏洞,如WEP攻击)极低(密钥过短,易暴力破解)
速度较快(硬件加速优化后更高效)极快(无复杂运算,适合低性能设备)较慢(已被淘汰,性能不如AES)
填充机制需要(如PKCS#7)不需要(流密码特性)需要(如PKCS#5)
应用场景广泛(HTTPS、文件加密、硬件安全等)已弃用(曾用于SSL/TLS、WEP)遗留系统(被3DES或AES取代)
是否被破解未发现实用攻击(量子计算威胁待研究)已被广泛破解(如Fluhrer-Mantin-Shamir攻击)可暴力破解(数小时内)
标准化情况NIST标准(FIPS 197)未标准化(现已被主流协议禁用)NIST旧标准(FIPS 46-3,已淘汰)
推荐使用✅ 首选❌ 禁用❌ 禁用(仅3DES临时过渡)

                (至此关于对称密码的文章都已更新完毕,非对称密码已在路上感兴趣请关注)

(需要源代码联系博主免费领取!!还希望多多关注点赞支持,你的支持就是我的最大动力!!!) 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全瞭望Sec

感谢您的打赏,您的支持让我更加

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值