AES 高级加密标准深度解析:从 Rijndael 设计到安全性证明
概述
高级加密标准(Advanced Encryption Standard, AES) 是全球使用最广泛的对称加密算法。它并非凭空产生,而是历经 5 年公开遴选,从 15 个候选方案中脱颖而出的结果。1997 年,美国国家标准与技术研究院(NIST)启动 AES 征集计划,旨在取代已运行近 20 年的数据加密标准(DES)。比利时密码学家 Joan Daemen 和 Vincent Rijmen 提交的 Rijndael 算法最终胜出,于 2001 年 11 月 26 日正式发布为 FIPS 197 标准。
二十余年来,AES 构成了现代信息安全的底层支柱。从 HTTPS 通信、Wi-Fi 加密(WPA2/WPA3)、磁盘加密(BitLocker/FileVault),到区块链钱包密钥派生、军事级机密保护,AES 的身影无处不在。它不仅是工程实践的基石,更是密码学设计艺术的典范——其 SPN(代换-置换网络)结构、有限域上的精巧运算,以及对差分/线性密码分析的强抵抗能力,使其成为教科书级别的分组密码设计。
本文将从标准出发,系统拆解 AES 的完整设计:轮函数的四步运算、S 盒的数学构造原理、密钥扩展算法、以及安全性分析的思路。同时,我们将与国密 SM4 进行对比,理解两种设计哲学的异同。
算法基本参数
AES 是一种分组长度固定为 128 位(16 字节)、密钥长度可为 128/192/256 位的迭代分组密码。不同于 DES 的 Feistel 结构,AES 采用 SPN(Substitution-Permutation Network) 结构——每轮都对全部数据进行代换和置换操作,而非仅处理一半。
| 参数 | AES-128 | AES-192 | AES-256 |
|---|---|---|---|
| 密钥长度(位) | 128 | 192 | 256 |
| 密钥字数(4字节) | $N_k = 4$ | $N_k = 6$ | $N_k = 8$ |
| 分组长度(位) | 128 | 128 | 128 |
| 分组字数(4字节) | $N_b = 4$ | $N_b = 4$ | $N_b = 4$ |
| 轮数 | $N_r = 10$ | $N_r = 12$ | $N_r = 14$ |
注:AES 的轮数仅与密钥长度相关,与分组长度无关。这是因为 AES 的安全边际设计——更多轮数抵抗更强的密码分析。AES 的处理单位为状态矩阵(State)——一个 $4 \times N_b$ 的字节矩阵:
$$ \text{State} = \begin{pmatrix} s_{0,0} & s_{0,1} & s_{0,2} & s_{0,3} \\ s_{1,0} & s_{1,1} & s_{1,2} & s_{1,3} \\ s_{2,0} & s_{2,1} & s_{2,2} & s_{2,3} \\ s_{3,0} & s_{3,1} & s_{3,2} & s_{3,3} \end{pmatrix} $$
明文、轮密钥、密文都被组织为这种矩阵形式。加密过程就是对这个矩阵反复施加轮函数变换。
轮函数结构
AES 的每一轮(除最后一轮外)包含四个可逆变换,按执行顺序依次为:SubBytes(字节替换)→ ShiftRows(行移位)→ MixColumns(列混合)→ AddRoundKey(轮密钥加)。
SubBytes(字节替换)
SubBytes 是 AES 中唯一的非线性变换,它通过 S 盒(Substitution Box)将每个字节独立映射为另一个字节。S 盒的构造基于有限域 $GF(2^8)$ 上的两个步骤:
步骤 1:求输入字节 $a$ 在 $GF(2^8)$(模不可约多项式 $m(x) = x^8 + x^4 + x^3 + x + 1$)上的乘法逆元。约定 $0x00$ 映射到自身。
步骤 2:对逆元结果施加仿射变换(仿射变换在 $GF(2)$ 上的矩阵乘法 + 异或常数 $0x63$):
$$ b'_i = b_i \oplus b_{(i+4)\bmod 8} \oplus b_{(i+5)\bmod 8} \oplus b_{(i+6)\bmod 8} \oplus b_{(i+7)\bmod 8} \oplus c_i $$
其中 $c = 0x63 = (01100011)_2$。
AES 的 S 盒必须包含全部 256 个替换值如下:
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76
1 ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
2 b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
3 04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
4 09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
5 53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
6 d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
7 51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
8 cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
9 60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db
a e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
b e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
c ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
d 70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
e e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
f 8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16S 盒的设计准则:NIST 要求 S 盒必须具有(1)非线性度(nonlinearity)尽可能高,以抵抗线性密码分析;(2)差分均匀性(differential uniformity)尽可能低,以抵抗差分密码分析;(3)代数表达式足够复杂,以抵抗插值攻击。AES S 盒的最大差分概率为 $2^{-6}$(即任何输入差分导致特定输出差分的概率不超过 $2^{-6}$),非线性度为 112,接近 $GF(2^8)$ 上 8 次仿射函数的最大值 128。
ShiftRows(行移位)
ShiftRows 对状态矩阵的每一行进行不同长度的循环左移:
- 第 0 行:不移位
- 第 1 行:循环左移 1 字节
- 第 2 行:循环左移 2 字节
- 第 3 行:循环左移 3 字节
ShiftRows 实现了跨列扩散:经过 SubBytes 后,同一列的 4 字节已无关联;经过 ShiftRows,字节被均匀分散到不同列中。这使得单列内的字节在后续 MixColumns 处理后,会影响多个列的状态。
MixColumns(列混合)
MixColumns 对状态矩阵的每一列独立施加线性变换。每一列被视为 $GF(2^8)$ 上的 4 次多项式,与固定多项式 $a(x) = 03x^3 + 01x^2 + 01x + 02$ 相乘,再模 $x^4 + 1$:
$$ \begin{pmatrix} s'_{0,c} \\ s'_{1,c} \\ s'_{2,c} \\ s'_{3,c} \end{pmatrix} = \begin{pmatrix} 02 & 03 & 01 & 01 \\ 01 & 02 & 03 & 01 \\ 01 & 01 & 02 & 03 \\ 03 & 01 & 01 & 02 \end{pmatrix} \begin{pmatrix} s_{0,c} \\ s_{1,c} \\ s_{2,c} \\ s_{3,c} \end{pmatrix} $$
所有运算在 $GF(2^8)$ 上进行(加法 = 异或,乘法 = 模不可约多项式乘法)。
MixColumns 的关键性质:
- 分支数(Branch Number)为 5:即输入和输出的非零字节数之和至少为 5。这是最优的扩散性质——2 个非零字节经过 MixColumns 后至少变成 5 个非零字节。
- 线性扩散:与 SubBytes 的非线性互补,实现雪崩效应。
AddRoundKey(轮密钥加)
最简单的步骤——将状态矩阵与对应轮密钥进行按字节异或:
$$ s'_{r,c} = s_{r,c} \oplus k_{r,c} $$
轮密钥由密钥扩展算法(Key Expansion)从原始密钥派生,每轮使用不同的轮密钥。AddRoundKey 本身不提供扩散或混淆,但它将密钥信息充分混合到状态中。
加密与解密
加密流程:
- AddRoundKey(初始轮密钥加,使用 $W[0, N_k-1]$)
- 对第 1 轮到第 $N_r-1$ 轮:SubBytes → ShiftRows → MixColumns → AddRoundKey
- 第 $N_r$ 轮(无 MixColumns):SubBytes → ShiftRows → AddRoundKey
密钥扩展算法
密钥扩展算法从原始 $N_k$ 个字的密钥派生 $N_b \times (N_r + 1)$ 个字(包含初始轮密钥)。以 AES-128 为例,需要 11 个轮密钥 = 44 个字。
算法描述(以 AES-128 为例,$N_k = 4$):
KeyExpansion(byte key[4*Nk], word W[Nb*(Nr+1)], Nk)
word temp
i = 0
while (i < Nk)
W[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])
i = i + 1
i = Nk
while (i < Nb * (Nr+1))
temp = W[i-1]
if (i mod Nk = 0)
temp = SubWord(RotWord(temp)) ⊕ Rcon[i/Nk]
W[i] = W[i-Nk] ⊕ temp
i = i + 1其中:
RotWord:字的循环左移 1 字节SubWord:对字中每个字节施加 S 盒替换- `Rcon[i] = [RC_i, 0x00, 0x00, 0x00]$,$RC_i = x^{i-1}$ in $GF(2^8)$
- 每轮密钥都依赖于原始密钥的全部比特(通过递归的 XOR 链接)
- S 盒的非线性保证了轮密钥之间不存在线性关系
- 常数 Rcon 消除了对称性(否则密钥扩展具有周期 $N_k$ 的对称性)
安全性分析
差分密码分析
差分密码分析通过追踪明文对的差分(XOR 差分)在轮函数中的传播来恢复密钥。由于 AES S 盒的最大差分概率为 $2^{-6}$,经过完整 AES 加密后,差分特征的概率上界极低:
- 4 轮差分特征上界:每轮至少激活 5 个 S 盒(分支数 5),每轮的差分概率 $\leq (2^{-6})^5 = 2^{-30}$,4 轮 $\leq 2^{-120}$
- 10 轮 AES-128:安全边际极大,需要约 $2^{128}$ 个选择明文,远超实际能力
线性密码分析
线性密码分析通过寻找明文、密文、密钥比特间的线性近似表达式来恢复密钥。AES S 盒的非线性度为 112,接近最优(128),这使得 Bias $\epsilon$ 的上界 $\leq 2^{-3}$,多轮累积后线性攻击的复杂度也超过穷举。
积分攻击(Square Attack)
积分攻击是 AES 最强大的理论攻击。2002 年,Nicolas Courtois 和 Josef Pieprzyk 提出针对 7 轮 AES-256 的积分攻击,复杂度约为 $2^{78}$ 次加密——优于穷举($2^{255}$)。但这仍远高于实用攻击门槛,且该攻击未能扩展到 10 轮 AES-128。
相关密钥攻击
2009 年,Alex Biryukov 和 Dmitry Khovratovich 提出对 9 轮 AES-256 的相关密钥攻击,复杂度 $2^{39}$。但 AES-256 的完整轮数为 14 轮,这一攻击同样无法威胁实际部署。
实际安全状况
截至目前,没有任何能在实用时间内破解完整轮数 AES-128/192/256 的攻击方法。AES 的安全强度可总结为:
| 版本 | 穷举复杂度 | 最佳理论攻击 | 安全评估 |
|---|---|---|---|
| AES-128 | $2^{128}$ | 约 $2^{126}$(biclique attack) | 足够安全 |
| AES-192 | $2^{192}$ | 约 $2^{189.7}$(biclique attack) | 足够安全 |
| AES-256 | $2^{256}$ | 约 $2^{254.4}$(biclique attack) | 足够安全 |
量子计算威胁:Grover 算法可将穷举复杂度降至 $2^{n/2}$,即 AES-128 降至 $2^{64}$,AES-256 降至 $2^{128}$。因此,量子时代建议使用 AES-256。
AES 与 SM4 的设计对比
AES(FIPS 197)与 SM4(GM/T 0002-2012)是全球最主流的两种分组密码标准。尽管设计年代不同(AES 2001,SM4 2012),但它们在结构上存在有趣的对应关系:
| 维度 | AES (FIPS 197) | SM4 (GM/T 0002-2012) |
|---|---|---|
| 分组长度 | 128 位 | 128 位 |
| 密钥长度 | 128/192/256 位 | 128 位 |
| 轮数 | 10/12/14 | 32 |
| 结构类型 | SPN | Feistel-like(非平衡) |
| 非线性部件 | $8 \times 8$ S 盒 | $8 \times 8$ S 盒 |
| 线性变换 | 矩阵乘法(MDS) | 循环移位 + XOR |
| 轮密钥生成 | 递归 + Rcon | 递归 + FK + CK |
- 结构:AES 是经典 SPN;SM4 是非平衡 Feistel 网络(奇数轮 $F$ 函数由明文生成异或密钥,偶数轮 $F$ 函数由轮密钥生成异或数据)。
- 轮数策略:AES 以少量轮数(10-14)实现强扩散(依赖 S 盒的强非线性 + MixColumns 的 MDS 性质);SM4 以大量轮数(32)实现安全性(线性变换更简单)。
- 线性层:AES MixColumns 使用 MDS 矩阵,分支数为 5(最优);SM4 使用循环移位,分支数为 2(较弱)。SM4 通过增加轮数弥补了线性层的不足。
性能考量
软件实现
AES 在支持 AES-NI 指令集的现代 CPU 上,加密吞吐量可达数 GB/s(单核)。纯软件实现(无硬件加速)通常使用 T-Table 技术——将 SubBytes、MixColumns、轮密钥加的组合预先计算为 4 个 $256 \times 32$ 位的查找表(每个约 1KB),每轮只需 16 次查表 + 12 次异或。
AES-128 单块加密约需:
- T-Table:约 16 次查表 + 12 次异或 × 10 轮 ≈ 280 次操作
- AES-NI:10 条 AESENC 指令,延迟约 80 个时钟周期(Haswell 架构)
硬件实现
AES 硬件实现可分为三类:
- 全展开(Fully Unrolled):面积大、吞吐量最高(10+ GB/s),适合数据中心加速卡
- 折叠(Folded):每轮复用同一组 SubBytes/MixColumns 硬件,面积小
- 位串行(Bit-serial):面积极小(约 2K 门),适合 RFID/IoT,吞吐量低(Mbps)
与 SM4 性能对比
在无硬件加速场景下,SM4 的每轮操作更简单(循环移位 + XOR),32 轮的总操作量与 AES 的 10 轮相近。在有国密硬件加速的平台上,SM4 可通过专用电路实现高吞吐。
工程实践要点
密钥使用规范
- 密钥应使用真随机数生成器(TRNG)生成,避免使用伪随机数(/dev/urandom 在熵不足时)
- AES-GCM 的 IV(Nonce)必须唯一,重复使用同一密钥+IV 会彻底破坏安全性
- 密钥定期轮换:NIST SP 800-57 建议 AES-128 的 Cryptoperiod 不超过 2 年
模式选择
- GCM(Galois/Counter Mode):最常用的 AEAD 模式,支持认证加密 + 附加认证数据(AAD),TLS 1.3 默认
- CBC(Cipher Block Chaining):旧式模式,需要随机 IV,不提供认证(需配合 HMAC 使用)
- CTR(Counter Mode):可并行加密,但需保证 IV 唯一
- XTS(XEX-based Tweaked-codebook):磁盘加密模式,支持随机访问
常见陷阱
- S 盒实现错误:256 个值必须完整正确,不能用省略号
- 密钥扩展的 Rcon 索引:从 $i/N_k$ 计算时是整数除法,不是模
- CBC 模式的 Padding Oracle:使用 CBC 必须配合 HMAC 或选择 GCM
- IV 重复:AES-GCM/CTR 中 IV 重复导致灾难性安全失效
总结
AES 的成功在于其设计平衡了安全性、性能和实现的简洁性:
- 安全性:SPN 结构 + MDS 矩阵 + 强非线性 S 盒,抗差分/线性攻击的冗余度极高
- 性能:T-Table 实现和硬件指令集加速使其成为最快的分组密码之一
- 灵活性:三种密钥长度覆盖从轻量级到量子安全的多种场景
- 开放设计:完全公开的设计原理经受住了 20 余年的密码分析考验
参考来源
- FIPS 197: Advanced Encryption Standard (AES) — 原始标准
- Daemen, J., Rijmen, V. "The Design of Rijndael: AES - The Advanced Encryption Standard" (Springer, 2002)
- NIST SP 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM)
- GM/T 0002-2012: SM4 Block Cipher Algorithm — 国密标准
- Biryukov, A., Khovratovich, D. "Related-Key Cryptanalysis of the Full AES-192 and AES-256" (ASIACRYPT 2009)
相关实践
- SM4 分组密码算法原理详解:从设计思想到安全分析 — 国密对比分析
- SM4 国密对称加密实战:CBC/ECB/GCM 模式与性能调优 — SM4 工程实战
- 认证加密与关联数据(AEAD):从加密到认证的统一框架 — AES-GCM 属于此类