文章目录
- 前言
- 一丶AES基本加密流程
- 二、基于表实现的AES算法
-
* 1.调整轮函数结构
- 2.T-boxs
- 3.Tyi_tables
- 4.XOR tables
- 5.表合并
- 6.总结
- 三、AES算法白盒加密实现
- 参考
前言
近日开始学白盒密码,没有技巧,全靠头发,特此记录.
![在这里插入图片描述](https://img-
blog.csdnimg.cn/707d57f8e9154d5488e9c2fb5ad31daf.jpeg#pic_center)
一丶AES基本加密流程
在AES加密中通常分以下四个模块:
设中间值变量为state,它通常被描述为一个二维的字节数组,即,一个4×4数组。
- 轮密钥加(AddRoundKey) :中间值state与16字节轮密钥进行异或。
- 字节替换(SubBytes) :通过S盒完成一个字节到另一个字节的映射
- 行位移(ShiftRows) :中间值state矩阵内部字节之间进行置换
- 列混淆(MixColumns) :中间值state左乘一个在GF(256)上面的可逆矩阵,每次更新只影响中间值state的一列(4个字节)。
加密中每轮的密钥 k i k_i ki分别由种子密钥经过密钥扩展算法得到,具体加密流程如下:
![图1:AES加密流程](https://img-
blog.csdnimg.cn/d0fc83215e3c4314adff30b7f2509ebd.png#pic_center)
具体细节不再赘述,具体请查阅AES加密详细流程。
二、基于表实现的AES算法
1.调整轮函数结构
为了方便基于查表法的AES实现,原来的轮函数结构将会适当做出调整。
1)重新定义for循环,将 A d d R o u n d K e y ( s t a t e , k 0 ) AddRoundKey(state,k_0)
AddRoundKey(state,k0)加入循环中,并将 A d d R o u n d K e y ( s t a t e , k 9 )
AddRoundKey(state,k_9) AddRoundKey(state,k9)移出循环,具体加密流程如下:
![](https://img-
blog.csdnimg.cn/5c48d0e31f4b462d9a7a5e79ec2f13c5.jpeg#pic_center)
2)将for循环内中ShiftRows移至于第一,其次为AddRoundKey,SubBytes,MixColumns.
交换ShiftRows与SubBytes位置
这里需要注意的是ShiftRows是一个线性变化,SubBytes是通过S盒完成一个字节到另一个字节的映射,所以无论ShiftRows与SubBytes相互之间的位置发生什么样的变化都不影响加密结果。
设输入为 x 0 , x 1 . . . . . x 15 x_0,x_1…x_{15} x0,x1…x15, S ( x )
S(x) S(x)为字节替换操作,根据下图大家自行脑补ShiftRows与SubBytes位置发生变化时,结果是否会发生改变。
![在这里插入图片描述](https://img-
blog.csdnimg.cn/b9a241e13f1a4c739ff6abf4a5a00873.png#pic_center)
交换ShiftRows与AddRoundkey位置
中间值状态 S t a t e State State每次应于相应的 轮密钥 k k
k做异或运算,因此如需要交换ShiftRows与AddRoundkey位置,可以对轮密钥 k k
k做同样的置换运算,然后交换行移位和轮密钥加进行一个交换,这里的原理和上面的类似,主要是因为轮密钥加并不改变位置,行移位不改变值。
最终加密流程如下:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/5ee48cb3efc747f79de94ace48a366aa.png#pic_center)
经过以上处理后,我们可以开始构造相应查找表 T-box,Ty_tables,XOR tables,Tyiboxs 。
2.T-boxs
在每一轮中,AddRoundKey和SubBytes可以组合成16个将字节映射到字节的查找表(8bit进8bit出)。T-boxs定义如下:
T i r ( x ) = S ( x ⊕ k ^ r − 1 [ i ] ) , for i = 0 … 15 and r = 1 … 9 , T i
10 ( x ) = S ( x ⊕ k ^ 9 [ i ] ) ⊕ k 10 [ i ] , for i = 0 … 15.
\begin{array}{rlrl} T_{i}^{r}(x) & =S\left(x \oplus
\widehat{k}{r-1}[i]\right), & \text { for } i & =0 \ldots 15 \text { and }
r=1 \ldots 9, \\ T{i}^{10}(x) & =S\left(x \oplus \widehat{k}{9}[i]\right)
\oplus k{10}[i], & \text { for } i=0 \ldots 15 . \end{array}
Tir(x)Ti10(x)=S(x⊕k r−1[i]),=S(x⊕k 9[i])⊕k10[i], for i for
i=0…15.=0…15 and r=1…9,
注意,第10轮的t-box包含了两个轮密钥(k9和k10)的字节,总共有160个T-boxs盒。
因此,我们定义T-box[10][16][256],其中10为轮数,16为字节个数,256是字节值,C语言实现如下
u8 TBoxes[10][16][256];
void GetTbox(u8 key[176]) {
for (int r = 0; r <= 9; r++) {//轮数
shiftRows (key + 16*r);
for (int index = 0; index < 16; index++)//字节数
{
for (int x = 0; x < 256; x++) {//0-255
TBoxes[r][index][x] = SBox[x^key[16 * r + index]];
if (r == 9) {
TBoxes[r][index][x] = TBoxes[r][index][x]^ key[16 * (r + 1) + index];
}
}
}
}
}
3.Tyi_tables
在第1轮到第9轮中,在每个字节通过T-box进行映射后,然后将其输入到一个混合列转换中。在第1轮中, T 0 1 , T 1 1 , T 2 1 , T 3
1 T_01,T_11,T_21,T_31 T01,T11,T21,T31的输出被解释为列向量,然后与矩阵MC相乘。该计算可以使用表来实现。
因MixColumns 每次作用在一列,可由32×32的矩阵 MC 乘32比特的列向量表示,在白盒实现中加密时的 MixColumns 与解密时的
MixColumns 逆操作都可通过四个较小规模的8bit输入到32bit输出的查找表操作后再通过异或的方式完成。查找表 T y i Ty_i
Tyi构造方式如下:
T y 0 ( x ) = x ⋅ [ 2 , 1 , 1 , 3 ] T T y 1 ( x ) = x ⋅ [ 3 , 2 , 1 , 1 ] T T
y 2 ( x ) = x ⋅ [ 1 , 3 , 2 , 1 ] T T y 3 ( x ) = x ⋅ [ 1 , 1 , 3 , 2 ] T
Ty_0(x)=x \cdot [2,1,1,3]^T\\ Ty_1(x)=x \cdot [3,2,1,1]^T\\ Ty_2(x)=x \cdot
[1,3,2,1]^T\\ Ty_3(x)=x \cdot [1,1,3,2]^T
Ty0(x)=x⋅[2,1,1,3]TTy1(x)=x⋅[3,2,1,1]TTy2(x)=x⋅[1,3,2,1]TTy3(x)=x⋅[1,1,3,2]T
最后MixColumns可表示为4次查表于3次异或操作(异或需要借助XOR tables):
M i x C o l u m n s : T y 0 ( x ) ⊕ T y 1 ( x ) ⊕ T y 2 ( x ) ⊕ T y 3 ( x )
MixColumns:Ty_0(x)\oplus Ty_1(x)\oplus Ty_2(x)\oplus Ty_3(x)
MixColumns:Ty0(x)⊕Ty1(x)⊕Ty2(x)⊕Ty3(x)
u32 TyiTables[4][256];
void GetTyiTable() {
for (int i = 0; i < 4; i++) {
for (int x = 0; x < 256; x++) {
TyiTables[0][x] = (gMul(2, x) << 24) | (x << 16) | (x << 8) | gMul(3, x);
TyiTables[1][x] = (gMul(3, x) << 24) | (gMul(2, x) << 16) | (x << 8) | x;
TyiTables[2][x] = (x << 24) | (gMul(3, x) << 16) | (gMul(2, x) << 8) | x;
TyiTables[3][x] = (x << 24) | (x << 16) | (gMul(3, x) << 8) | gMul(2, x);
}
}
}
4.XOR tables
Xor tables用于对于每轮当中的两个半字节进行一个查表的异或运算,因此我们定义数组为:
Xor tables[9][96][16][16],其中9为轮数,96为一轮所需的异或次数,16,16为4bit数所有可能值。
u8 xorTable[9][96][16][16]
void GetxorTable() {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 96; j++) {
for (int x = 0; x < 16; x++) { //2的4次方=16
for (int y = 0; y < 16; y++) {
xorTable[i][j][x][y] = x^y;
}
}
}
}
}
5.表合并
T-boxs表于Tyi_tables实际上可以进行合并成为新的表Tyiboxs,组合查找表可以减少执行加密所需的单个表的访问次数。合并方法如下所示:
T y 0 ∘ T 0 1 ( x ) = T y 0 ( T 0 1 ( x ) ) T y_{0} \circ T_{0}^{1}(x)=T
y_{0}\left(T_{0}^{1}(x)\right) Ty0∘T01(x)=Ty0(T01(x))
u32 TyiBoxes[9][16][256];
void GetTyiBoxs() {
for (int r = 0; r < 9; r++) {
for (int index = 0; index < 16; index++)
{
for (int x = 0; x < 256; x++)
{
u8 t = TBoxes[r][index][x];
TyiBoxes[r][index][x] = TyiTables[index % 4][t];
}
}
}
}
注意:TyiBoxes仅用于前9轮加密,第10轮加密中仍需要用到TBoxes。
6.总结
最终,整个AES加密流程可以通过Tyiboxs,XORTables,TBoxes三个表实现,参考[2]中的流程图如下:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/7747db61e85448d5b2bf554b68783b53.png#pic_center)
代码实现如下:
void Table_encrypt(u8 input[16], u8 output[16]) {
u32 a, b, c, d, aa, bb, cc, dd;
for (int i = 0; i < 9; i++) {
shiftRows(input);
for (int j = 0; j < 4; j++) {
a = TyiBoxes[i][4 * j + 0][input[4 * j + 0]];
b = TyiBoxes[i][4 * j + 1][input[4 * j + 1]];
c = TyiBoxes[i][4 * j + 2][input[4 * j + 2]];
d = TyiBoxes[i][4 * j + 3][input[4 * j + 3]];
aa = xorTable[i][24 * j + 0][(a >> 28) & 0xf][(b >> 28) & 0xf];
bb = xorTable[i][24 * j + 1][(c >> 28) & 0xf][(d >> 28) & 0xf];
cc = xorTable[i][24 * j + 2][(a >> 24) & 0xf][(b >> 24) & 0xf];
dd = xorTable[i][24 * j + 3][(c >> 24) & 0xf][(d >> 24) & 0xf];
input[4 * j + 0] = xorTable[i][24 * j + 4][aa][bb] << 4 | xorTable[i][24 * j + 5][cc][dd];
aa = xorTable[i][24 * j + 6][(a >> 20) & 0xf][(b >> 20) & 0xf];
bb = xorTable[i][24 * j + 7][(c >> 20) & 0xf][(d >> 20) & 0xf];
cc = xorTable[i][24 * j + 8][(a >> 16) & 0xf][(b >> 16) & 0xf];
dd = xorTable[i][24 * j + 9][(c >> 16) & 0xf][(d >> 16) & 0xf];
input[4 * j + 1] = xorTable[i][24 * j + 10][aa][bb] << 4 | xorTable[i][24 * j + 11][cc][dd];
aa = xorTable[i][24 * j + 12][(a >> 12) & 0xf][(b >> 12) & 0xf];
bb = xorTable[i][24 * j + 13][(c >> 12) & 0xf][(d >> 12) & 0xf];
cc = xorTable[i][24 * j + 14][(a >> 8) & 0xf][(b >> 8) & 0xf];
dd = xorTable[i][24 * j + 15][(c >> 8) & 0xf][(d >> 8) & 0xf];
input[4 * j + 2] = xorTable[i][24 * j + 16][aa][bb] << 4 | xorTable[i][24 * j + 17][cc][dd];
aa = xorTable[i][24 * j + 18][(a >> 4) & 0xf][(b >> 4) & 0xf];
bb = xorTable[i][24 * j + 19][(c >> 4) & 0xf][(d >> 4) & 0xf];
cc = xorTable[i][24 * j + 20][(a >> 0) & 0xf][(b >> 0) & 0xf];
dd = xorTable[i][24 * j + 21][(c >> 0) & 0xf][(d >> 0) & 0xf];
input[4 * j + 3] = xorTable[i][24 * j + 22][aa][bb] << 4 | xorTable[i][24 * j + 23][cc][dd];
}
}
//第十轮
shiftRows(input);
for (int j = 0; j < 16; j++) {
input[j] = TBoxes[9][j][input[j]];
}
for (int i = 0; i < 16; i++)
output[i] = input[i];
}
加密结果:
![在这里插入图片描述](https://img-
blog.csdnimg.cn/8f32867c722b47f79eb11677f0a90908.png#pic_center)
AES算法的查表实现至此结束,而实际上Tboxes/TyiTables是存有密钥,在文献[1]中提到破解过程如下:
a = S − 1 ∘ T y 0 − 1 ∘ ( T y 0 ∘ T 0 1 ) a=S^{-1}\circ Ty_0^{-1}\circ(Ty_0
\circ T^1_0) a=S−1∘Ty0−1∘(Ty0∘T01)
既只需要构造一个逆TyiTable,根据逆S盒与逆TyiTable恢复AddRoundKey操作的中间值,并穷举可能密钥,获取正确密钥。
三、AES算法白盒加密实现
待续
参考
博客与代码
[1]https://developer.aliyun.com/article/952800
[2]https://github.com/balena/aes-whitebox
论文
[1]CHOW S, EISEN P A, JOHNSON H, et al. White-box cryptography and an AES
implementation[C]. In: Selected Areas in Cryptography—SAC 2002. Springer
Berlin Heidelberg, 2003: 250–270
[2]Muir J A. A tutorial on white-box AES[J]. Advances in network analysis and
its applications, 2013: 209-229.
最后
从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。
因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个有趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
扫码领取