type
status
date
slug
summary
tags
category
icon
password
全文使用ECB循环加密模式的AES

一、简述

AES-128接受16字节的plaintext,16字节的key,输出16字节的cipher
notion image

二、密钥处理

由上面流程图可以知道,密钥扩展后是16 * 11共176个字节,按16个字节一组划分为k0、k1......k10 实际生成时,是每四个字节合为一个字,共44个字,每一组key含四个字
notion image
密钥生成时一共有三种生成方式:
  1. k0:输入的key每四位一组
  1. k1到k10的第一列(描述为W4、W8、W12......W40):Wn = g(W_n-1) ^ W_n-4 (g函数包含:行移位、S盒替换、字节异或)
  1. 其余部分:Wn = W_n-1 ^ W_n-4

1.步骤1

假设key = abcdefghijklmnop 则W0 = abcd W1 = efgh W2 = ijkl W3 = mnop

2.步骤2

g()行位移

我以W4运算时所需的W3操作为例子
notion image

g()S盒替换

标准AES加密的S盒是固定的,操作实际上不难,将数据本身作为索引取出S盒数据中对应的值(解密时使用逆S盒) 还是以W3为例子,经过行位移后的值为6E 6F 70 6D

g()字节异或

将上一步结果中的最高字节rcon表对应异或
继续以W3为例子,上一步得到结果为[0x9f, 0xa8, 0x51, 0x3c],我们用W3来得到W4
而W4计算对应rcon表第一个(同理W8对应第二个,W40对应第十个)
取最高字节0x9F,异或0x01

最终

经过上面操作,得到最终的g(W3) = 0x9EA8513C
所以W4 = g(W3) ^ W0

3.步骤3

剩下的部分,满足
Wn = W_n-1 ^ W_n-4
以求W5为例子
这里可以根据初始密钥key = abcdefghijklmnop,模拟计算一下W0~W43

三、对明文运算

1.对初始plaintext进行state化

例如,输入为00112233445566778899aabbccddeeff,进行从上到下,从左到右顺序state化
notion image

2.初始轮密钥

k0同上面state一样进行从上到下,从左到右(后面的key都一样)
然后将state与k0对应异或得到初始轮密钥加后的state

3.十轮主运算

前九轮运算

包含四个步骤:字节替换(S盒),行移位,列混淆,轮密钥加
其中字节替换与上文无异,轮密钥加与得到初始轮密钥加后的state操作一样
  • 行移位 初始轮密钥加后的state ,第一行左移0位,第二行左移1位,第三行左移2位,第四行左移3位
notion image
  • 列混淆(这步最复杂) 将特定矩阵X与行移位后的state矩阵相乘来实现 这里的特定矩阵X为(如果是解密,使用特定矩阵X' XX' = E)
notion image
但是,与特定矩阵X相乘后的加法和乘法不是正常的加法和乘法,这里的加法指的是异或(这也是轮密钥加是state与key异或的原因)。这里的乘法使用伽罗瓦域内乘法(基于GF(2^8)的二元运算),涉及算法我们不深入,只需要学习与AES-128加密相关的1 * x、2 * x、3 * x即可 详细解释如下:

第十轮运算

包含三个步骤:字节替换(S盒),行移位,轮密钥加。(同上)

四、代码实现(解密一起)

过了一遍手,代码结合大佬,自己进行分析注释

1.state矩阵化

2.密钥处理

3.字节替换

4.行移位

5.列混淆

6.轮密钥加

7.加密过程

8.解密过程

9.求逆S盒(附加)

针对有些题会进行变种s盒,对应逆s盒也会变化,学习计算逆s盒的代码实现 s盒字节替换本质上是根据输入作为索引,找到s盒中对应值,来替换原本值,据此,可以得到:
 
XYCTF2024-reversepolarctf2024春季挑战赛
Loading...
Sh4d0w
Sh4d0w
漫长学习路ing
最新发布
360加固复现学习
2025-6-15
java反射机制
2025-6-14
classLoader机制
2025-6-14
dex文件结构
2025-6-14
APP启动流程
2025-6-14
JNI学习
2025-6-14
公告
Welcome to Sh4dw’s blog!
敬请指导,Q 467194403