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
关键理解:GF(28)中的加法就是XOR,这使得硬件实现极为高效。乘法虽然复杂,但可以通过查表(如Log/Antilog表)快速完成。

3.1.3 不可约多项式

AES选用的不可约多项式为:

m(x) = x⁸ + x⁴ + x³ + x + 1   (0x11B)

这个多项式保证了域运算的封闭性和无零因子性,是AES安全性的数学保障。

GF(2⁸) 有限域结构 字节表示 0x57 = 01010111 多项式表示 x⁶ + x⁴ + x² + x + 1 系数在 GF(2) {1,0,1,0,1,1,1} 核心运算 加法 = XOR | 乘法 = 多项式乘模 m(x) | 乘法逆元 = 扩展欧几里得 不可约多项式 m(x) = x⁸ + x⁴ + x³ + x + 1 确保域封闭性,无零因子

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)
注意:最后一轮不执行MixColumns操作。这是为了保持加解密结构的对称性,使得解密流程可以直接逆向执行各步骤。
AES加密流程(128位密钥,10轮) 明文 (128 bit) AddRoundKey (初始) 第1~9轮(每轮4步) SubBytes ShiftRows MixColumns AddRoundKey 循环9次 SubBytes ShiftRows AddRoundKey (无MixColumns) 密文 (128 bit)

3.3 各步骤详解

3.3.1 字节代换(SubBytes)

SubBytes通过一个16×16的S盒对每个字节进行非线性替换。S盒的构造包含两个步骤:

  1. 求乘法逆元:在GF(2⁸)中计算每个字节的乘法逆元(0x00的逆元定义为自身)
  2. 仿射变换:对逆元进行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)
安全要点:S盒的非线性是AES抵抗线性密码分析和差分密码分析的核心。如果S盒是线性的,整个加密将变得可破解。

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)等场景。