type
status
date
slug
summary
tags
category
icon
password
全文使用ECB循环加密模式的AES
一、简述
AES-128接受16字节的plaintext,16字节的key,输出16字节的cipher
整体逻辑(图示by 白盒AES算法详解(一)-密码应用-看雪-安全社区|安全招聘|kanxue.com)
二、密钥处理
由上面流程图可以知道,密钥扩展后是16 * 11共176个字节,按16个字节一组划分为k0、k1......k10
实际生成时,是每四个字节合为一个字,共44个字,每一组key含四个字
密钥生成时一共有三种生成方式:
- k0:输入的key每四位一组
- k1到k10的第一列(描述为W4、W8、W12......W40):Wn = g(W_n-1) ^ W_n-4 (g函数包含:行移位、S盒替换、字节异或)
- 其余部分:Wn = W_n-1 ^ W_n-4
1.步骤1
假设key = abcdefghijklmnop
则W0 = abcd W1 = efgh W2 = ijkl W3 = mnop
2.步骤2
g()行位移
我以W4运算时所需的W3操作为例子
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化
2.初始轮密钥
k0同上面state一样进行从上到下,从左到右(后面的key都一样)
然后将state与k0对应异或得到初始轮密钥加后的state
3.十轮主运算
前九轮运算
包含四个步骤:字节替换(S盒),行移位,列混淆,轮密钥加
其中字节替换与上文无异,轮密钥加与得到初始轮密钥加后的state操作一样
- 行移位 初始轮密钥加后的state ,第一行左移0位,第二行左移1位,第三行左移2位,第四行左移3位
- 列混淆(这步最复杂) 将特定矩阵X与行移位后的state矩阵相乘来实现 这里的特定矩阵X为(如果是解密,使用特定矩阵X' XX' = E)
但是,与特定矩阵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盒中对应值,来替换原本值,据此,可以得到:
- 作者:Sh4d0w
- 链接:https://sh4d0w.life//article/a6a57f0a-9091-472c-9aff-2815d91acacf
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。