AES
高级加密标准(Advanced Encryption Standard,AES),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。在 CTF 逆向工程中,AES 是最常出现的对称加密算法之一。选手不仅需要理解其数学原理,更需要掌握如何在汇编代码中快速识别算法特征、判断加密模式以及提取密钥。
以下是关于 AES 算法的原理、结构、识别特征及逆向分析策略的专业讲解。
1. 算法概述
AES 是一种基于 SPN(Substitution-Permutation Network,代换-置换网络) 结构的分组密码。
-
分组长度:固定为 128 位(16 字节)。即使密钥长度不同,分组长度依然不变。
-
密钥长度:支持 128 位、192 位和 256 位。
-
轮数(Rounds):取决于密钥长度。
-
AES-128:10 轮
-
AES-192:12 轮
-
AES-256:14 轮
-
-
状态(State):AES 内部将 16 字节的数据处理为一个 \(4 \times 4\) 的字节矩阵。
2. 内部结构与核心变换
AES 的每一轮加密(除最后一轮外)都包含四个核心步骤:字节代换(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns) 和 轮密钥加(AddRoundKey)。最后一轮不包含列混淆。
2.1 字节代换 (SubBytes) —— 非线性层
这是 AES 唯一的非线性变换,也是算法安全性的核心。
-
操作:将状态矩阵中的每个字节作为索引,去查找一个固定的 256 字节查找表,称为 S-Box (Substitution Box)。
-
数学原理:在有限域 \(GF(2^8)\) 上求乘法逆元,再进行仿射变换。
-
逆向特征:S-Box 是识别 AES 最强烈的特征。标准的 S-Box 通常以
0x63, 0x7C, 0x77, 0x7B...开头。
2.2 行移位 (ShiftRows) —— 线性扩散层
-
操作:对状态矩阵的每一行进行循环左移。
-
第 0 行:不移动。
-
第 1 行:循环左移 1 字节。
-
第 2 行:循环左移 2 字节。
-
第 3 行:循环左移 3 字节。
-
-
逆向特征:在汇编中表现为对 16 字节缓冲区的特定位置进行交换或移动操作,或者利用 SIMD 指令(如
pshufb)进行重排。
2.3 列混淆 (MixColumns) —— 线性扩散层
-
操作:对状态矩阵的每一列进行矩阵乘法。每一列被视为 \(GF(2^8)\) 上的多项式,与一个固定的多项式 \(c(x) = 3x^3 + x^2 + x + 2\) 进行模乘。
-
逆向特征:
-
在 32 位实现中,常表现为复杂的异或和查表操作(T-Table)。
-
涉及有限域乘法,常见
x2time操作(左移一位,若溢出则异或0x1B)。 -
常数乘法:列混淆中涉及乘以 0x02, 0x03, 0x01, 0x01。
-
2.4 轮密钥加 (AddRoundKey)
-
操作:将状态矩阵与当前的轮密钥(Round Key)进行按位异或(XOR)。
-
逆向特征:显式的 XOR 指令,操作数来源于密钥扩展生成的数组。
3. 密钥扩展 (Key Schedule)
AES 需要从初始密钥(Seed Key)生成所有轮次的子密钥。
-
过程:
-
将初始密钥直接作为第一组轮密钥。
-
后续轮密钥通过对前一组密钥进行
RotWord(字循环移位)、SubWord(S-Box 代换)和Rcon(轮常数)异或来生成。
-
-
逆向特征:
- Rcon 数组:密钥扩展算法中使用特定的轮常数数组
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36。这是识别 AES 的另一个关键指纹。
- Rcon 数组:密钥扩展算法中使用特定的轮常数数组
4. CTF 逆向中的识别特征
在二进制文件中,可以通过以下特征快速定位 AES 算法:
-
S-Box 识别:
-
在数据段(
.data或.rodata)搜索 S-Box 的前几个字节:63 7C 77 7B F2 6B 6F C5。 -
如果存在逆向解密函数,还会发现逆 S-Box(Inverse S-Box):
52 09 6A D5 30 36 A5 38。
-
-
T-Table 识别:
-
为了优化性能,许多 AES 实现(如 OpenSSL)将 SubBytes、ShiftRows 和 MixColumns 合并为 4 个 1KB 的查找表(Te0, Te1, Te2, Te3)。
-
查找由 256 个 32 位整数组成的大表。
-
-
Rcon 数组识别:
- 搜索字节序列
01 02 04 08 10 20 40 80 1B 36。
- 搜索字节序列
-
AES-NI 指令集:
- 现代 CPU 支持 AES 硬件加速。如果反编译代码中出现
AESENC,AESENCLAST,AESKEYGENASSIST等指令,则是显式的硬件 AES 实现。
- 现代 CPU 支持 AES 硬件加速。如果反编译代码中出现
5. 常见加密模式
AES 是分组密码,处理长数据时需要结合分组工作模式。CTF 中常见的模式包括:
-
ECB (Electronic Codebook):
-
各块独立加密。
-
特征:相同的明文块产生相同的密文块,不安全,容易在视觉上被识别(企鹅图)。
-
-
CBC (Cipher Block Chaining):
-
引入初始向量(IV)。当前明文块先与前一密文块(或 IV)异或,再加密。
-
特征:主要逆向点在于找到 IV。
-
-
CTR (Counter):
- 将计数器加密后与明文异或。此时 AES 实际上变成了流密码。
-
GCM (Galois/Counter Mode):
-
提供认证加密(AEAD)。除加密外,还计算消息认证码(GMAC)。
-
特征:涉及 GHASH 算法。
-
6. 逆向分析与解密策略
在 CTF 题目中,AES 通常以以下几种形式出现:
6.1 标准 AES
-
现象:代码结构清晰,查找到标准的 S-Box 和 Rcon。
-
策略:
-
动态调试提取密钥(Key)和初始向量(IV)。通常在
AES_set_encrypt_key或AES_cbc_encrypt等函数的参数中。 -
利用 Python 脚本(如
Crypto.Cipher.AES)直接解密。
-
6.2 修改常数的 AES (Magic Number Modified)
-
现象:算法逻辑与 AES 一致,但 S-Box 内容或 Rcon 数组被修改。
-
策略:
-
提取内存中被修改的 S-Box 和 Rcon。
-
在解密脚本中传入自定义的 S-Box 进行解密。注意:如果修改了 S-Box,通常也需要重新生成逆 S-Box 用于解密。
-
6.3 白盒 AES (White-Box AES)
-
现象:代码被严重混淆,密钥被硬编码并分散在巨大的查找表网络中,无法直接提取。目的是在攻击者拥有完全控制权的环境下保护密钥。
-
策略:
-
DFA (Differential Fault Analysis):故障注入攻击。在运行过程中修改中间状态(通常是第 9 轮),对比正常和错误的密文,推导密钥。常用工具:
PhoenixAES。 -
侧信道分析 (Side-Channel Analysis):如 DCA (Differential Computation Analysis),利用软件执行时的内存访问或指令轨迹作为泄露源,模拟能量分析攻击。常用工具:
Daredevil。 -
转换攻击:有些简单的白盒 AES 可以通过提取核心查找表转化为标准的等效密钥。
-
6.4 AES-NI 硬件指令
-
现象:代码极短,直接使用汇编指令完成加密。
-
策略:重点分析
xmm寄存器的赋值,确定密钥和明文/密文的内存位置。通常密钥在AESKEYGENASSIST指令附近处理。
7. 总结
对于 CTF 选手,掌握 AES 需要达到三个层次:
-
识别:通过 S-Box、Rcon 或算法结构快速判断是 AES。
-
还原:提取 Key 和 IV,确定加密模式(ECB/CBC/CTR),编写脚本解密。
-
攻防:面对魔改 AES 或白盒 AES,能够使用故障注入或侧信道工具恢复密钥。