AES(高级加密标准)是一种对称分组密码算法,其核心参数如下:
- 密钥长度:支持 128 位、192 位 或 256 位三种规格(对应 AES-128、AES-192、AES-256),密钥越长,理论安全性越高,加解密轮数也不同:
- AES-128:10 轮加密
- AES-192:12 轮加密
- AES-256:14 轮加密
- 分组长度(块大小):固定为128 位(16 字节),无论密钥长度如何,输入/输出数据均按 128 位分组处理。
所有变体均基于相同的轮函数(字节代换 SubBytes、行移位 ShiftRows、列混淆 MixColumns、轮密钥加 AddRoundKey),仅轮数和密钥扩展(Key Expansion)逻辑不同。AES 不是流密码,使用时需配合工作模式(如 CBC、GCM、CTR)和填充(如 PKCS#7)来处理任意长度明文。
# 示例:使用 PyCryptodome 进行 AES-128-CBC 加密(需 pip install pycryptodome)fromCrypto.CipherimportAESfromCrypto.Randomimportget_random_bytesfromCrypto.Util.Paddingimportpad key=get_random_bytes(16)# AES-128 → 16 字节 = 128 位iv=get_random_bytes(16)# CBC 模式需要初始化向量cipher=AES.new(key,AES.MODE_CBC,iv)plaintext=b"Hello, AES!"ciphertext=cipher.encrypt(pad(plaintext,AES.block_size))AES 的列混淆(MixColumns)操作在 AES-128、AES-192 和 AES-256 中完全相同。
✅原因如下:
- MixColumns 是 AES 轮函数(Round Function)中的一个固定代数变换,作用于状态矩阵(4×4 字节)的每一列,使用 GF(2⁸) 上的线性变换(与固定多项式
c(x) = '0x03'·x³ + '0x01'·x² + '0x01'·x + '0x02'相乘)。 - 该操作仅依赖分组长度(128 位 → 4×4 状态矩阵),而与密钥长度无关。AES 所有变体(128/192/256)均采用相同的分组大小(128 位)和相同的状态结构,因此 MixColumns 的定义、实现和数学表达式完全一致。
- 密钥长度仅影响:
- 轮数(10/12/14 轮),
- 密钥扩展算法(Key Expansion)的复杂度与轮密钥生成逻辑(如 AES-256 需额外的 SubWord 变换),
- 初始密钥加(AddRoundKey)所用的轮密钥字数。
⚠️ 注意:最后一轮(Final Round)不执行 MixColumns(所有变体均如此),这是 AES 标准统一规定的,与密钥长度无关。
# MixColumns 单列示例(GF(2^8), mod x^8+x^4+x^3+x+1)defmix_column(col):# col = [b0, b1, b2, b3], each bytefromCrypto.Util.numberimportbyte_to_long,long_to_bytes# 实际实现需基于 Rijndael 的有限域乘法(如 xtime)# 此处省略细节,但无论密钥长度如何,此函数不变...