3. 对称加密算法AES:结构、密钥扩展与模式对比
AES(Advanced Encryption Standard)是当今最广泛使用的对称分组密码算法,由美国国家标准与技术研究院(NIST)于2001年正式发布。AES固定分组长度为128比特,支持128/192/256比特三种密钥长度,对应轮数分别为10/12/14轮。本章深入剖析AES的四个核心操作层、密钥扩展算法以及三种主流工作模式(ECB/CBC/CTR)的工程特性。
3.1 AES算法结构总览
AES以字节为基本处理单元,将128比特明文组织成4×4的字节矩阵(State)。每一轮迭代依次执行:字节代换(SubBytes)、行移位(ShiftRows)strong>、列混合(MixColumns)、轮密钥加(AddRoundKey)。最后一轮省略列混合操作。
- 分组大小:128 bits(16字节)
- 密钥长度:128 / 192 / 256 bits
- 轮数:10 / 12 / 14
- 状态矩阵:4行 × 4列(每字节8 bits)
3.2 四个核心操作详解
3.2.1 字节代换(SubBytes)
对状态矩阵中每个字节独立进行非线性替换。使用一个固定的16×16 S盒(基于GF(2⁸)上的乘法逆元和仿射变换构造)。S盒具有高非线性度,能有效抵抗差分和线性密码分析。
3.2.2 行移位(ShiftRows)
对状态矩阵的每一行进行循环左移:第0行不移,第1行移1字节,第2行移2字节,第3行移3字节。该操作实现字节在列之间的扩散。
| 行号 | 移位量(加密) | 移位量(解密) |
|---|---|---|
| 0 | 0 | 0 |
| 1 | 1 | 3 |
| 2 | 2 | 2 |
| 3 | 3 | 1 |
3.2.3 列混合(MixColumns)
将状态矩阵的每一列视为GF(2⁸)上的4项多项式,与固定多项式 c(x) = 0x03·x³ + 0x01·x² + 0x01·x + 0x02 相乘后模 x⁴ + 1。该操作实现列内字节的混合扩散,是AES达到完全雪崩效应的关键。
3.2.4 轮密钥加(AddRoundKey)
将状态矩阵与轮密钥矩阵进行逐字节异或(XOR)。轮密钥由密钥扩展算法从主密钥派生。
3.3 密钥扩展(Key Expansion)
密钥扩展算法从初始密钥生成所有轮次所需的轮密钥。对于AES-128,需要生成10个轮密钥(每个16字节),加上初始密钥共176字节。扩展过程基于字(4字节)操作,核心步骤包括:
- RotWord: 将4字节字循环左移1字节。
- SubWord: 对字中每个字节应用S盒替换。
- Rcon: 与轮常数(
Rcon[i] = [2^(i-1), 0, 0, 0])异或。
# AES-128 密钥扩展伪代码(Python风格)
def key_expansion(key):
# key: 16字节初始密钥
w = [0] * 44 # 44个字(4字节/字)
for i in range(4):
w[i] = key[4*i:4*i+4]
for i in range(4, 44):
temp = w[i-1]
if i % 4 == 0:
temp = sub_word(rot_word(temp)) ^ rcon[i//4]
w[i] = w[i-4] ^ temp
return w # 每4个字构成一个轮密钥
3.4 ECB / CBC / CTR 模式对比
AES作为分组密码,直接加密固定长度分组。实际应用中需要工作模式来处理任意长度消息。三种最常用模式的对比如下:
| 特性 | ECB(电子密码本) | CBC(密码分组链接) | CTR(计数器) |
|---|---|---|---|
| 加密方式 | 每个分组独立加密 | 前一分组密文与当前明文异或后加密 | 计数器值加密后与明文异或 |
| 是否需要IV | 否 | 是(随机IV,16字节) | 是(Nonce + 计数器,16字节) |
| 并行加密 | 支持 | 不支持 | 支持 |
| 并行解密 | 支持 | 支持 | 支持 |
| 错误传播 | 仅影响当前分组 | 影响当前及下一分组 | 仅影响当前分组 |
| 密文模式 | 确定型(相同明文→相同密文) | 概率型(IV随机化) | 概率型(Nonce随机化) |
| 典型应用 | ❌ 不推荐(不安全) | 文件加密、TLS 1.2 | 磁盘加密、TLS 1.3、VPN |
3.5 模式选择建议
- 通用数据加密:优先选择 AES-256-CTR,配合随机Nonce(96 bits)和计数器(32 bits),支持并行和随机访问。
- 文件/磁盘加密:推荐 AES-XTS(基于CTR的变体,专为存储设计)或 AES-CBC + HMAC认证。
- 网络协议(TLS 1.3):使用 AES-128-GCM 或 AES-256-GCM(CTR模式 + GMAC认证,提供加密+完整性)。
- 遗留系统兼容:若必须使用CBC,务必使用随机IV并附加HMAC或CMAC认证,防止填充预言攻击。
AES的数学结构保证了高安全强度,但工作模式的选择直接影响安全性、性能和可认证性。现代密码工程中,认证加密(AEAD)如GCM、CCM已成为事实标准,将加密与完整性保护合二为一。