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_data_unit

(来源:AES - CTF Wiki

一般来讲,我们会使用十六进制对明文进行编码。

AES 每轮的加密主要分为 4 个操作:

  • 轮密钥加 (AddRoundKey)
  • 字节替换 (SubBytes)
  • 行移位 (ShiftRows)
  • 列混淆 (MixColumns)

其中第一轮仅执行 “轮密钥加” 操作;最后一轮执行 “列混淆” 操作。

aes_details

(来源:[原创] 128 位 AES 加密算法图解 - 看雪,注意上面的列混淆的矩阵乘法等号左边的列向量应该在右边。)

1.1 轮密钥加

根据传入的轮数,将状态矩阵与对应的 W[i] 异或。该过程中有两个输入参数,分别为明文和子密钥 k ,都是 128 位(16 字节)。

AddRoundKey

1.2 字节替换

简单说就是一个查表操作

SubBytes

如上图,a[0,0]0x12, 查 S 盒 [1,2] 处得到 0xC9a[0,1]0xAB,查 S 盒 [A,B] 处,也就是 [10,11],得到 0x62

如果是逆 S 盒,那方法也相同,以 0xC9 为例,查逆 S 盒 [C,9][13,9],对应表中值为 0x12

1.3 行移位

行位移将输入的数据作为一个 4x4 矩阵进行处理 可以理解为左循环位移操作

第一行保持不变,第二行左移 1 字节 ,第三行左移 2 字节,第四行左移 3 字节

813468_QC94QRQKGMUEYPR

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

813468_NN4U4URSVQY4W69

1.4 列混淆

列混合变换就是矩阵相乘,行位移后的状态矩阵和修补矩阵 (fixed matrix) 做矩阵相乘,得出输出列。

813468_UES487VAAZPKDFS

在解密的逆向列混淆中,修补矩阵与正向列混淆的互为逆矩阵。

813468_ZCDXZKFMZA7K9SD

AES (step-by-step) 可以看到每一轮加密的示例过程。

2. 逆向

我们说了这么多原理,但是如何解决 AES 呢?

实际上,AES 仍是一个对称加密算法,因此只要获得密文和密钥就可以得到明文:

Example

GWCTF 2019 - re3
Self-Modified Code

1
2
3
4
5
6
7
8
from Crypto.Cipher import AES
from Crypto.Util.number import *

key = bytes.fromhex('cb8d493521b47a4cc1ae7e62229266ce')
cipher_text = bytes.fromhex('BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B')
plain_text = AES.new(key, AES.MODE_ECB).decrypt(cipher_text)
print(plain_text)
# flag{924a9ab2163d390410d0a1f670}

©2025-Present Watermelonabc | 萌ICP备20251229号

Powered by Hexo & Stellar latest & Vercel & 𝙌𝙞𝙪𝙙𝙪𝙣 𝘾𝘿𝙉 & HUAWEI Cloud
您的访问数据将由 Vercel 和自托管的 Umami 进行隐私优先分析,以优化未来的访问体验

本博客总访问量:capoo-2

| 开往-友链接力 | 异次元之旅 | 中文独立博客列表

猫猫🐱 发表了 41 篇文章 · 总计 209.8k 字