3. AES算法详解:AES的数学基础与加密流程
AES(Advanced Encryption Standard,高级加密标准)是当今最广泛使用的对称分组密码算法。它由比利时密码学家 Joan Daemen 和 Vincent Rijmen 设计,于2001年被NIST采纳为FIPS PUB 197标准。AES支持128、192、256位密钥长度,分组大小为128位。本章深入剖析AES的数学基础、完整加密流程及密钥扩展机制。
3.1 有限域GF(28):AES的数学基石
AES的所有字节操作都建立在有限域GF(28)之上。理解这个域是掌握AES内部变换的关键。
3.1.1 域的定义与表示
GF(28)是一个包含256个元素的有限域。每个元素可以表示为:
- 字节形式:一个8位二进制数,如
0x57=01010111 - 多项式形式:系数在GF(2)上的多项式,最高次不超过7。例如
0x57对应多项式:
x6 + x4 + x2 + x + 1
3.1.2 域运算规则
| 运算 | 规则 | 示例 |
|---|---|---|
| 加法 | 按位异或(XOR) | 0x57 ⊕ 0x83 = 0xD4 |
| 乘法 | 多项式乘法后模不可约多项式 m(x) = x8 + x4 + x3 + x + 1 |
0x57 · 0x83 = 0xC1 |
| 乘法逆元 | 对非零元素a,存在b使得 a·b = 1 mod m(x) | 0x57-1 = 0x5E |
3.1.3 不可约多项式
AES选用的不可约多项式为:
m(x) = x⁸ + x⁴ + x³ + x + 1 (0x11B)
这个多项式保证了域运算的封闭性和无零因子性,是AES安全性的数学保障。
3.2 AES加密完整流程
AES加密以128位(16字节)为一个分组,处理过程分为四个核心步骤:字节代换、行移位、列混合、轮密钥加。轮数取决于密钥长度:10轮(128位)、12轮(192位)、14轮(256位)。
3.2.1 状态矩阵
加密前,将128位明文按列优先排列成4×4字节矩阵,称为状态矩阵:
输入: 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
状态矩阵:
[32] [88] [31] [e0]
[43] [5a] [31] [37]
[f6] [30] [98] [07]
[a8] [8d] [a2] [34]
3.2.2 加密流程步骤
| 步骤 | 操作 | 数学本质 | 可逆性 |
|---|---|---|---|
| SubBytes | 每个字节通过S盒替换 | GF(2⁸)乘法逆元 + 仿射变换 | 是(查逆S盒) |
| ShiftRows | 状态矩阵各行循环左移 | 行置换 | 是(循环右移) |
| MixColumns | 每列与固定矩阵相乘 | GF(2⁸)矩阵乘法 | 是(乘逆矩阵) |
| AddRoundKey | 状态与轮密钥XOR | GF(2⁸)加法 | 是(再次XOR) |
3.3 各步骤详解
3.3.1 字节代换(SubBytes)
SubBytes通过一个16×16的S盒对每个字节进行非线性替换。S盒的构造包含两个步骤:
- 求乘法逆元:在GF(2⁸)中计算每个字节的乘法逆元(0x00的逆元定义为自身)
- 仿射变换:对逆元进行GF(2)上的仿射变换
仿射变换公式:
b'_i = b_i ⊕ b_{(i+4) mod 8} ⊕ b_{(i+5) mod 8} ⊕ b_{(i+6) mod 8} ⊕ b_{(i+7) mod 8} ⊕ c_i
其中 c = 0x63 (01100011)
3.3.2 行移位(ShiftRows)
状态矩阵的每一行进行循环左移:
- 第0行:不移位
- 第1行:左移1字节
- 第2行:左移2字节
- 第3行:左移3字节
移位前: 移位后:
[a0] [a4] [a8] [ac] [a0] [a4] [a8] [ac]
[b0] [b4] [b8] [bc] → [b4] [b8] [bc] [b0]
[c0] [c4] [c8] [cc] [c8] [cc] [c0] [c4]
[d0] [d4] [d8] [dc] [dc] [d0] [d4] [d8]
3.3.3 列混合(MixColumns)
将状态矩阵的每一列视为GF(2⁸)上的4维向量,与固定矩阵相乘:
新列 = 固定矩阵 × 原列
[02] [03] [01] [01] [s0] [s'0]
[01] [02] [03] [01] · [s1] = [s'1]
[01] [01] [02] [03] [s2] [s'2]
[03] [01] [01] [02] [s3] [s'3]
其中乘法在GF(2⁸)中进行,加法为XOR。
3.3.4 轮密钥加(AddRoundKey)
将状态矩阵与轮密钥矩阵进行逐字节XOR。这是最简单的步骤,但也是将密钥信息注入加密过程的关键环节。
3.4 密钥扩展(Key Expansion)
AES从初始密钥生成所有轮密钥的过程称为密钥扩展。对于128位密钥,需要生成10个轮密钥(每个16字节),加上初始密钥共176字节。
3.4.1 扩展算法
密钥扩展以4字节字(Word)为单位。初始密钥构成前4个字(w[0]~w[3]),后续每个字由前一个字和4个字前的字通过以下规则生成:
如果 i mod 4 ≠ 0:
w[i] = w[i-4] ⊕ w[i-1]
如果 i mod 4 = 0:
w[i] = w[i-4] ⊕ SubWord(RotWord(w[i-1])) ⊕ Rcon[i/4]
3.4.2 辅助函数
| 函数 | 操作 | 作用 |
|---|---|---|
| RotWord | 4字节循环左移1字节 | 打破字节对齐 |
| SubWord | 对每个字节应用S盒 | 引入非线性 |
| Rcon | 轮常数,Rcon[j] = (2j-1, 0, 0, 0) | 消除轮间对称性 |
3.4.3 轮常数Rcon
Rcon值在GF(2⁸)中计算,前10个为:
Rcon[1] = 0x01000000
Rcon[2] = 0x02000000
Rcon[3] = 0x04000000
Rcon[4] = 0x08000000
Rcon[5] = 0x10000000
Rcon[6] = 0x20000000
Rcon[7] = 0x40000000
Rcon[8] = 0x80000000
Rcon[9] = 0x1B000000
Rcon[10] = 0x36000000
3.5 AES安全性总结
AES的安全性建立在以下数学特性之上:
- 非线性:S盒的仿射变换和乘法逆元提供强非线性
- 扩散:ShiftRows和MixColumns确保单比特变化影响多个字节
- 密钥敏感性:密钥扩展算法确保密钥微小变化产生完全不同的轮密钥
- 抵抗已知攻击:目前对完整AES最有效的攻击仅能将复杂度降低约2倍(如Biclique攻击),远低于暴力破解的2128
截至当前,AES仍是全球最广泛部署的分组密码算法,被用于TLS/SSL、Wi-Fi加密(WPA2/WPA3)、磁盘加密(BitLocker、FileVault)等场景。