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 字节 |
4.2 字节代换(SubBytes)
字节代换是 AES 中唯一的非线性变换,通过一个 16×16 的 S 盒(Substitution Box)对状态矩阵中的每个字节独立进行替换。S 盒的设计基于有限域 GF(2⁸) 上的乘法逆元和仿射变换,具有良好的非线性特性和抗差分/线性密码分析能力。
字节代换步骤:
- 将输入字节的高 4 位作为行索引,低 4 位作为列索引,在 S 盒中查找对应的输出字节。
- 将输出字节替换回状态矩阵的对应位置。
S 盒查找表示例(十六进制):
| 行\列 | 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 | 16 |
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
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]
4.6 AES 安全性分析
AES 自发布以来经历了广泛的密码分析,至今仍被认为是安全的。以下是其安全性的关键保障:
| 攻击类型 | 对 AES 的有效性 | 说明 |
|---|---|---|
| 暴力破解 | 不可行 | AES-128 密钥空间为 2¹²⁸,以当前计算能力无法在合理时间内穷举 |