一次AES白盒密钥还原
AES的基本流程,
通常(128)有11轮加密,每轮有4个操作
- AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
- SubBytes—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
- ShiftRows—将矩阵中的每个横列进行循环式移位。
- MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。
白盒加密,就是利用查表的方式,将计算过程隐藏达到隐藏Key的目的
问题出在最后一轮第11轮上,最后一步改为与key作为xor 运算,从这里入手,应该可以得到第10轮KEY
最后一轮xor运算的查表,通过原始数据和最终数据 xor 可以还原出 KEY
P ^ Key = C
P ^ C = Key
printf("\nround 10Key:");
for(col = 0; col < STATE_COLS; col++)
{
for(row = 0; row < STATE_ROWS; row++)
{
/// 这是最终的密文
encryptedBlock[col * STATE_COLS + row] = state[row][col];
// 还原密钥
unsigned char round10_key = state[row][col] ^ wat->FINALROUND[row][col][state[row][col]];
printf("%02x", round10_key);
}
}
printf("\n");
结果
安全起见,密钥已经替换,这里只是展示
round 10Key:ba7acf373c24865e3b843dc3d1309bdc
我们得到第10轮的密钥,利用Stark 工具,还原密钥
./aes_keyschedule ba7acf373c24865e3b843dc3d1309bdc 10
K00: 9B97368D139F87A62EB3309D843DB724 <<<<== 密钥
K01: BD3E00D2AEA187748012B7E9042F00CD
K02: AA5DBD2004FC3A5484EE8DBD80C18D70
K03: D600ECEDD2FCD6B956125B04D6D3D674
K04: B8F67E1B6A0AA8A23C18F3A6EACB25D2
K05: B7C9CB9CDDC3633EE1DB90980B10B54A
K06: 5D1C1DB780DF7E896104EE116A145B5B
K07: E72524B567FA5A3C06FEB42D6CEAEF76
K08: E0FA1CE5870046D981FEF2F4ED141D82
K09: 015E0FB0865E496907A0BB9DEAB4A61F
K10: BA7ACF373C24865E3B843DC3D1309BDC
这样,就得到原始密钥(第0轮) 9B97368D139F87A62EB3309D843DB724