4. 对称加密算法(二):AES算法原理、字节代换、行移位、列混合、轮密钥加

AES(Advanced Encryption Standard,高级加密标准)是当今最广泛使用的对称分组密码算法,由 Joan Daemen 和 Vincent Rijmen 设计,于 2001 年被 NIST 采纳为 FIPS PUB 197 标准。AES 替代了旧的 DES 算法,成为保护电子数据的官方标准。AES 是一种迭代型分组密码,其分组长度固定为 128 位,密钥长度支持 128、192 或 256 位,对应的轮数分别为 10、12、14 轮。

4.1 AES 算法总体结构

AES 的加密过程以字节为基本处理单元,将 128 位明文分组排列成一个 4×4 的字节矩阵(称为状态矩阵)。每一轮迭代包含四个核心步骤:字节代换(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)和轮密钥加(AddRoundKey)。最后一轮省略列混合操作。

关键参数速查表
参数 AES-128 AES-192 AES-256
密钥长度(位) 128 192 256
分组长度(位) 128 128 128
轮数 10 12 14
状态矩阵大小 4×4 字节 4×4 字节 4×4 字节
设计思想:AES 采用 SPN(Substitution-Permutation Network,代换-置换网络)结构,与 DES 的 Feistel 结构不同。SPN 结构在每一轮中同时混淆和扩散所有数据位,通常具有更快的软件实现速度和更紧凑的硬件实现。
AES-128 加密整体流程 128 位明文 初始轮密钥加 (AddRoundKey) 第 1 轮 (SubBytes → ShiftRows → MixColumns → AddRoundKey) ⋮ 第 9 轮 (SubBytes → ShiftRows → MixColumns → AddRoundKey) 第 10 轮 (SubBytes → ShiftRows → AddRoundKey) (最后一轮省略 MixColumns) 128 位密文 密钥扩展 轮密钥 0 轮密钥 1 ⋯ 轮密钥 10 说明: • 初始轮密钥加在首轮迭代之前执行,使用轮密钥 0。 • 第 1 至 9 轮执行全部四个步骤;第 10 轮省略 MixColumns。 • 解密过程使用逆操作(InvSubBytes、InvShiftRows、InvMixColumns),轮密钥使用顺序相反。

4.2 字节代换(SubBytes)

字节代换是 AES 中唯一的非线性变换,通过一个 16×16 的 S 盒(Substitution Box)对状态矩阵中的每个字节独立进行替换。S 盒的设计基于有限域 GF(2⁸) 上的乘法逆元和仿射变换,具有良好的非线性特性和抗差分/线性密码分析能力。

字节代换步骤:

  1. 将输入字节的高 4 位作为行索引,低 4 位作为列索引,在 S 盒中查找对应的输出字节。
  2. 将输出字节替换回状态矩阵的对应位置。
S 盒构造数学原理:首先在 GF(2⁸) 上计算字节的乘法逆元(00 的逆元定义为 00),然后对逆元进行仿射变换:b'ᵢ = bᵢ ⊕ b₍ᵢ₊₄₎ₘₒₙ₈ ⊕ b₍ᵢ₊₅₎ₘₒₙ₈ ⊕ b₍ᵢ₊₆₎ₘₒₙ₈ ⊕ b₍ᵢ₊₇₎ₘₒₙ₈ ⊕ cᵢ,其中 c = 0x63。

S 盒查找表示例(十六进制):

行\列 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 637C777BF26B6FC53001672BFED7AB76
1 CA82C97DFA5947F0ADD4A2AF9CA472C0
2 B7FD9326363FF7CC34A5E5F171D83115
3 04C723C31896059A071280E2EB27B275
4 09832C1A1B6E5AA0523BD6B329E32F84
5 53D100ED20FCB15B6ACBBE394A4C58CF
6 D0EFAAFB434D338545F9027F503C9FA8
7 51A3408F929D38F5BCB6DA2110FFF3D2
8 CD0C13EC5F974417C4A77E3D645D1973
9 60814FDC222A908846EEB814DE5E0BDB
A E0323A0A4906245CC2D3AC629195E479
B E7C8376D8DD54EA96C56F4EA657AAE08
C BA78252E1CA6B4C6E8DD741F4BBD8B8A
D 703EB5664803F60E613557B986C11D9E
E E1F8981169D98E949B1E87E9CE5528DF
F 8CA1890DBFE6426841992D0FB054BB16
示例:输入字节 0x53,行索引 = 5,列索引 = 3,查表得输出字节 0xED。逆 S 盒(InvSubBytes)用于解密过程。

4.3 行移位(ShiftRows)

行移位是 AES 中的扩散操作,对状态矩阵的每一行进行循环左移。移位规则如下:

  • 第 0 行:不移位(偏移量 0)
  • 第 1 行:循环左移 1 个字节
  • 第 2 行:循环左移 2 个字节
  • 第 3 行:循环左移 3 个字节

行移位操作确保了列之间的数据扩散,使得经过多轮迭代后,每个输出位都依赖于所有输入位。

行移位前后状态矩阵对比:
位置 列 0 列 1 列 2 列 3
行 0(不移位) a₀₀ → a₀₀ a₀₁ → a₀₁ a₀₂ → a₀₂ a₀₃ → a₀₃
行 1(左移 1) a₁₀ → a₁₁ a₁₁ → a₁₂ a₁₂ → a₁₃ a₁₃ → a₁₀
行 2(左移 2) a₂₀ → a₂₂ a₂₁ → a₂₃ a₂₂ → a₂₀ a₂₃ → a₂₁
行 3(左移 3) a₃₀ → a₃₃ a₃₁ → a₃₀ a₃₂ → a₃₁ a₃₃ → a₃₂

4.4 列混合(MixColumns)

列混合操作对状态矩阵的每一列独立进行线性变换。每一列被视为 GF(2⁸) 上的一个 4 维向量,与一个固定的 4×4 矩阵相乘(在 GF(2⁸) 上的乘法和加法)。

列混合变换公式:

对于每一列 [s₀, s₁, s₂, s₃]ᵀ,计算:
s'₀ = (02 · s₀) ⊕ (03 · s₁) ⊕ (01 · s₂) ⊕ (01 · s₃)
s'₁ = (01 · s₀) ⊕ (02 · s₁) ⊕ (03 · s₂) ⊕ (01 · s₃)
s'₂ = (01 · s₀) ⊕ (01 · s₁) ⊕ (02 · s₂) ⊕ (03 · s₃)
s'₃ = (03 · s₀) ⊕ (01 · s₁) ⊕ (01 · s₂) ⊕ (02 · s₃)

其中:
- 乘法 · 是 GF(2⁸) 上的乘法(模不可约多项式 x⁸ + x⁴ + x³ + x + 1)
- ⊕ 是逐位异或(XOR)
- 01、02、03 是十六进制常数,分别对应多项式 1、x、x+1
实现注意:在软件实现中,列混合通常通过预计算的查找表(如 T 盒)来加速。乘以 02 相当于左移 1 位后若溢出则异或 0x1B;乘以 03 等于乘以 02 再异或原值。解密时的逆列混合(InvMixColumns)使用不同的常数矩阵。

4.5 轮密钥加(AddRoundKey)

轮密钥加是最简单的步骤:将状态矩阵与当前轮的轮密钥进行逐字节异或(XOR)。轮密钥由主密钥通过密钥扩展算法生成,每个轮密钥的大小与状态矩阵相同(128 位,即 16 字节)。

密钥扩展算法要点:

  • 对于 AES-128,主密钥直接作为轮密钥 0。
  • 后续轮密钥通过递归方式生成:每 4 个字(16 字节)为一组。
  • 当字索引是 4 的倍数时,执行 RotWord(循环左移 1 字节)、SubWord(S 盒替换)和异或轮常数 Rcon。
  • 轮常数 Rcon[i] = [xⁱ⁻¹, 00, 00, 00],其中 xⁱ⁻¹ 在 GF(2⁸) 中计算。
轮密钥加示例:
状态矩阵(十六进制):    轮密钥(十六进制):    结果(XOR):
[19, 3D, E3, BE]        [A0, 88, 23, 2A]        [B9, B5, C0, 94]
[BE, E3, 19, 3D]   ⊕    [FA, 54, A3, 6C]   =    [44, B7, BA, 51]
[3D, BE, E3, 19]        [FE, 2C, 39, 76]        [C3, 92, DA, 6F]
[E3, 19, 3D, BE]        [17, B1, 39, 05]        [F4, A8, 04, BB]
AES 单轮内部结构(第 1-9 轮) 状态矩阵输入 ① 字节代换 (SubBytes) S 盒逐字节替换 ② 行移位 (ShiftRows) 各行循环左移 ③ 列混合 (MixColumns) GF(2⁸) 矩阵乘法 ④ 轮密钥加 (AddRoundKey) 与轮密钥逐字节 XOR 状态矩阵输出 轮密钥 (16 字节) 注意: • 最后一轮(第 10 轮)省略步骤 ③ 列混合,仅执行 SubBytes → ShiftRows → AddRoundKey。 • 解密过程按相反顺序执行逆操作:InvAddRoundKey → InvMixColumns → InvShiftRows → InvSubBytes。

4.6 AES 安全性分析

AES 自发布以来经历了广泛的密码分析,至今仍被认为是安全的。以下是其安全性的关键保障:

← 上一章📖 返回目录下一章 →
攻击类型 对 AES 的有效性 说明
暴力破解 不可行 AES-128 密钥空间为 2¹²⁸,以当前计算能力无法在合理时间内穷举