Skip to content

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)生成所有轮次的子密钥。

  • 过程:

    1. 将初始密钥直接作为第一组轮密钥。

    2. 后续轮密钥通过对前一组密钥进行 RotWord(字循环移位)、SubWord(S-Box 代换)和 Rcon(轮常数)异或来生成。

  • 逆向特征:

    • Rcon 数组:密钥扩展算法中使用特定的轮常数数组 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36。这是识别 AES 的另一个关键指纹。

4. CTF 逆向中的识别特征

在二进制文件中,可以通过以下特征快速定位 AES 算法:

  1. 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。

  2. T-Table 识别:

    • 为了优化性能,许多 AES 实现(如 OpenSSL)将 SubBytes、ShiftRows 和 MixColumns 合并为 4 个 1KB 的查找表(Te0, Te1, Te2, Te3)。

    • 查找由 256 个 32 位整数组成的大表。

  3. Rcon 数组识别:

    • 搜索字节序列 01 02 04 08 10 20 40 80 1B 36。
  4. AES-NI 指令集:

    • 现代 CPU 支持 AES 硬件加速。如果反编译代码中出现 AESENC, AESENCLAST, AESKEYGENASSIST 等指令,则是显式的硬件 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。

  • 策略:

    1. 动态调试提取密钥(Key)和初始向量(IV)。通常在 AES_set_encrypt_key 或 AES_cbc_encrypt 等函数的参数中。

    2. 利用 Python 脚本(如 Crypto.Cipher.AES)直接解密。

6.2 修改常数的 AES (Magic Number Modified)

  • 现象:算法逻辑与 AES 一致,但 S-Box 内容或 Rcon 数组被修改。

  • 策略:

    1. 提取内存中被修改的 S-Box 和 Rcon。

    2. 在解密脚本中传入自定义的 S-Box 进行解密。注意:如果修改了 S-Box,通常也需要重新生成逆 S-Box 用于解密。

6.3 白盒 AES (White-Box AES)

  • 现象:代码被严重混淆,密钥被硬编码并分散在巨大的查找表网络中,无法直接提取。目的是在攻击者拥有完全控制权的环境下保护密钥。

  • 策略:

    1. DFA (Differential Fault Analysis):故障注入攻击。在运行过程中修改中间状态(通常是第 9 轮),对比正常和错误的密文,推导密钥。常用工具:PhoenixAES。

    2. 侧信道分析 (Side-Channel Analysis):如 DCA (Differential Computation Analysis),利用软件执行时的内存访问或指令轨迹作为泄露源,模拟能量分析攻击。常用工具:Daredevil。

    3. 转换攻击:有些简单的白盒 AES 可以通过提取核心查找表转化为标准的等效密钥。

6.4 AES-NI 硬件指令

  • 现象:代码极短,直接使用汇编指令完成加密。

  • 策略:重点分析 xmm 寄存器的赋值,确定密钥和明文/密文的内存位置。通常密钥在 AESKEYGENASSIST 指令附近处理。

7. 总结

对于 CTF 选手,掌握 AES 需要达到三个层次:

  1. 识别:通过 S-Box、Rcon 或算法结构快速判断是 AES。

  2. 还原:提取 Key 和 IV,确定加密模式(ECB/CBC/CTR),编写脚本解密。

  3. 攻防:面对魔改 AES 或白盒 AES,能够使用故障注入或侧信道工具恢复密钥。