我们来深入探讨 AES-256 算法本身以及所有相关的操作模式(Modes of Operation)。理解这两部分对于实际应用 AES 加密至关重要。
第一部分:AES-256 算法核心
AES-256 是 高级加密标准 (Advanced Encryption Standard) 的一个特定版本,使用 256 位(32 字节) 的密钥长度。它是一种对称密钥分组密码(Symmetric Key Block Cipher),意味着加密和解密使用相同的密钥,并且它一次处理一个固定长度的数据块。
基本参数:
- 密钥长度 (Key Length): 256 位 (这是它与 AES-128 和 AES-192 的主要区别)
- 分组大小 (Block Size): 128 位 (16 字节) (这是所有 AES 变种固定的)
- 轮数 (Number of Rounds): 14 轮 (AES-128 是 10 轮,AES-192 是 12 轮)
算法结构 (Rijndael 算法):
AES 基于 Rijndael 算法设计,其结构称为 置换-置换网络 (Substitution-Permutation Network, SPN)。每一轮(除了最后一轮稍有不同)都包含四个主要的可逆变换步骤:1. AddRoundKey (轮密钥加):
- 将当前状态(State,即 128 位数据块排成的 4x4 字节矩阵)与当前轮的轮密钥(Round Key) 进行按位异或 (XOR) 操作。
- 这是每一轮的第一步(初始轮)和最后一轮的最后一步。它引入了密钥的扩散。
2. SubBytes (字节替换):
- 使用一个固定的、非线性的 S 盒 (Substitution Box) 对状态矩阵中的每一个字节进行独立替换。
- S 盒的设计基于有限域上的乘法逆元和仿射变换,提供了算法的混淆 (Confusion) 特性,使得输入和输出之间的关系极其复杂,难以通过统计分析攻击。
3. ShiftRows (行移位):
- 对状态矩阵的每一行进行循环移位。
- 第 0 行不移位。
- 第 1 行循环左移 1 个字节。
- 第 2 行循环左移 2 个字节。
- 第 3 行循环左移 3 个字节(或等价地,循环右移 1 个字节)。
- 这个操作提供了扩散 (Diffusion),使得一个字节的改变在后续操作中影响多个列。
4. MixColumns (列混淆):
- 对状态矩阵的每一列视为有限域 GF(2⁸) 上的多项式,并与一个固定的多项式
c(x) = {03}x³ + {01}x² + {01}x + {02}
进行模 x⁴ + 1 乘法。 - 这个操作在列级别上混合数据,是扩散 (Diffusion) 的主要来源,使得一个字节的改变在后续操作中影响同一列的多个字节(进而通过下一轮的 ShiftRows 影响多个列)。
- 注意: 最后一轮省略 MixColumns 步骤。
- 对状态矩阵的每一列视为有限域 GF(2⁸) 上的多项式,并与一个固定的多项式
密钥扩展 (Key Expansion):
- 将初始的 256 位 (32 字节) 主密钥扩展为 15 个轮密钥(因为 14 轮加密需要 14 个轮密钥,加上初始 AddRoundKey 需要一个密钥,共 15 个)。
- 每个轮密钥是 128 位(16 字节)。
- 密钥扩展过程也使用类似加密轮的变换(SubBytes, ShiftRows, MixColumns 的变种
RotWord
,SubWord
, Rcon)以及异或操作。这个过程确保轮密钥之间具有高度的非线性关系,增强了安全性。 - 密钥扩展的复杂性是 AES-256 相对于 AES-128 在防御某些攻击(如相关密钥攻击)上被认为更强的一个原因(尽管核心轮数增加也是关键)。
加密过程概要:
- 将 128 位明文块转换为状态矩阵。
- 执行 AddRoundKey(使用第 0 轮密钥)。
- 对于第 1 轮到第 13 轮:
- SubBytes
- ShiftRows
- MixColumns
- AddRoundKey(使用当前轮密钥)
- 执行第 14 轮(最后一轮):
- SubBytes
- ShiftRows
- AddRoundKey(使用第 14 轮密钥)// 省略 MixColumns
- 将最终状态矩阵转换为 128 位密文块。