AES 高级加密标准深度解析:从 Rijndael 设计到安全性证明

算法原理 · 2026-07-10

概述

高级加密标准(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-128AES-192AES-256
密钥长度(位)128192256
密钥字数(4字节)$N_k = 4$$N_k = 6$$N_k = 8$
分组长度(位)128128128
分组字数(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 个替换值如下:

S 盒的设计准则: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 字节
$$ s'_{r,c} = s_{r, (c - r) \bmod 4}, \quad r = 0,1,2,3; \quad c = 0,1,2,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
解密流程:由于每个步骤都可逆,解密是加密的逆序:(InvShiftRows → InvSubBytes → AddRoundKey → InvMixColumns)。注意 AES 的解密结构与加密不同(不是 Feistel 的自反结构),需要实现逆运算的专用路径。

密钥扩展算法

密钥扩展算法从原始 $N_k$ 个字的密钥派生 $N_b \times (N_r + 1)$ 个字(包含初始轮密钥)。以 AES-128 为例,需要 11 个轮密钥 = 44 个字。

算法描述(以 AES-128 为例,$N_k = 4$):

其中:

  • 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/1432
结构类型SPNFeistel-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 余年的密码分析考验
与 SM4 的对比让我们看到了不同的设计哲学——AES 用"强轮函数+少轮数"换取效率,SM4 用"弱轮函数+多轮数"降低硬件复杂度。两种设计各有适用场景,共同构成了现代密码学的对称加密基石。

参考来源

  • 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)

相关实践