0


AES白盒加密解读与实现(Chow方案)

文章目录

前言

近日开始学白盒密码,没有技巧,全靠头发,特此记录.
在这里插入图片描述

一丶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加密流程
具体细节不再赘述,具体请查阅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​)移出循环,具体加密流程如下:


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位置发生变化时,结果是否会发生改变。

在这里插入图片描述

交换ShiftRows与AddRoundkey位置
中间值状态

     S 
    
   
     t 
    
   
     a 
    
   
     t 
    
   
     e 
    
   
  
    State 
   
  
State每次应于相应的 轮密钥 
 
  
   
   
     k 
    
   
  
    k 
   
  
k做异或运算,因此如需要交换ShiftRows与AddRoundkey位置,可以对轮密钥 
 
  
   
   
     k 
    
   
  
    k 
   
  
k做同样的置换运算,然后交换行移位和轮密钥加进行一个交换,这里的原理和上面的类似,主要是因为轮密钥加并不改变位置,行移位不改变值。

最终加密流程如下:
在这里插入图片描述
经过以上处理后,我们可以开始构造相应查找表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⊕kr−1​[i]),=S(x⊕k9​[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];voidGetTbox(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_0^1,T_1^1,T_2^1,T_3^1 
   
  
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];voidGetTyiTable(){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]voidGetxorTable(){for(int i =0; i <9; i++){for(int j =0; j <96; j++){for(int x =0; x <16; x++){//2的4次方=16for(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];voidGetTyiBoxs(){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]中的流程图如下:
在这里插入图片描述
代码实现如下:

voidTable_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];}

加密结果:
在这里插入图片描述
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.


本文转载自: https://blog.csdn.net/qq_37638441/article/details/128968233
版权归原作者 ·变秃也变强 所有, 如有侵权,请联系我们删除。

“AES白盒加密解读与实现(Chow方案)”的评论:

还没有评论