1. 基本介绍
AES(Advanced Encryption Standard,高级加密标准)是一种经典的块加密算法,用以取代 DES (Data Encryption Standard)。现在,AES 已经成为对称加密算法中最流行的算法之一。
AES 的明文区块长度固定为 128 bits,密钥长度则可以是 128、192 或 256 bits。加密过程中使用的密钥是由 Rijndael 密钥生成方案 产生的。
AES 加密过程是在一个 4×4 的字节矩阵上运行的,这个矩阵又称为 “体 (state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个 byte,即 8 bits)。

(来源:AES - CTF Wiki)
一般来讲,我们会使用十六进制对明文进行编码。
AES 每轮的加密主要分为 4 个操作:
- 轮密钥加 (AddRoundKey)
- 字节替换 (SubBytes)
- 行移位 (ShiftRows)
- 列混淆 (MixColumns)
其中第一轮仅执行 “轮密钥加” 操作;最后一轮仅不执行 “列混淆” 操作。

(来源:[原创] 128 位 AES 加密算法图解 - 看雪,注意上面的列混淆的矩阵乘法等号左边的列向量应该在右边。)
1.1 轮密钥加
根据传入的轮数,将状态矩阵与对应的 W[i]
异或。该过程中有两个输入参数,分别为明文和子密钥 k
,都是 128 位(16 字节)。

1.2 字节替换
简单说就是一个查表操作。

如上图,a[0,0]
是 0x12
, 查 S 盒 [1,2]
处得到 0xC9
;a[0,1]
是 0xAB
,查 S 盒 [A,B]
处,也就是 [10,11]
,得到 0x62
。
如果是逆 S 盒,那方法也相同,以 0xC9
为例,查逆 S 盒 [C,9]
即 [13,9]
,对应表中值为 0x12
。
1.3 行移位
行位移将输入的数据作为一个 4x4 矩阵进行处理 可以理解为左循环位移操作
第一行保持不变,第二行左移 1 字节 ,第三行左移 2 字节,第四行左移 3 字节

逆向行位移,第一行保持不变,第二行右移 1 字节,第三行右移 2 字节,第四行右移 3 字节

1.4 列混淆
列混合变换就是矩阵相乘,行位移后的状态矩阵和修补矩阵 (fixed matrix) 做矩阵相乘,得出输出列。
在解密的逆向列混淆中,修补矩阵与正向列混淆的互为逆矩阵。
在 AES (step-by-step) 可以看到每一轮加密的示例过程。
2. 逆向
我们说了这么多原理,但是如何解决 AES 呢?
实际上,AES 仍是一个对称加密算法,因此只要获得密文和密钥就可以得到明文:
GWCTF 2019 - re3
Self-Modified Code
1 | from Crypto.Cipher import AES |