一次AES白盒密钥还原

   #流水账 #日常 #工具 

AES的基本流程
通常(128)有11轮加密,每轮有4个操作

  1. AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  2. SubBytes—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  3. ShiftRows—将矩阵中的每个横列进行循环式移位。
  4. 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