Aes

書中可能出現的錯誤

  • March 24, 2020

所以我一直在閱讀這本書,名為“使用密碼學和 PKI 實現 SSL/TLS”,在閱讀時,這段程式碼讓我感到困惑

   static void compute_key_schedule ( 
   const unsigned char *key, int key_length, unsigned char w[ ][ 4 ] ) { 
   int i; int key_words = key_length >> 2; 
   unsigned char rcon = 0x01; // First, copy the key directly into the key schedule 
   memcpy( w, key, key_length ); 
   for ( i = key_words; i < 4 * ( key_words + 7 ); i++ ) { 
       memcpy( w[ i ], w[ i - 1 ], 4 ); 
       if ( !( i % key_words ) ) { 
           rot_word( w[ i ] ); 
           sub_word( w[ i ] ); 
           if ( !( i % 36 ) ) { 
               rcon = 0x1b; 
           } 
           w[ i ][ 0 ] ^= rcon; 
           rcon <<= 1; 
       } 
       else if ( ( key_words > 6 ) && ( ( i % key_words ) == 4 ) ) { 
           sub_word( w[ i ] ); 
       } 
       w[ i ][ 0 ] ^= w[ i - key_words ][ 0 ];
       w[ i ][ 1 ] ^= w[ i - key_words ][ 1 ];
       w[ i ][ 2 ] ^= w[ i - key_words ][ 2 ]; 
       w[ i ][ 3 ] ^= w[ i - key_words ][ 3 ]; 
   } 
}

文中說,在 128 位密鑰的情況下,輪常數每 4 次迭代移動一次(形成密鑰調度的單個密鑰字),總共 10 次移位,但在第 8 次移位時,輪常數為 0,並且 AES 要求每當它溢出時,你應該用 0x1b 異或它。所以我明白了,這就是我們這樣做的原因。if (i%36) rcon = 0x1b這是有道理的,但如果 key_length 是 192 位,這將是有問題的,因為在第 36 次迭代時,它將通過檢查( ! ( i % key_words))並將繼續將 rcon 更改為 0x1b,儘管不會一點也不溢出!(我相信當時的密鑰是 0x10,在 192 位的情況下會發生這種轉變)。

所以這對我來說沒有意義,我想知道我是否錯過了一些東西。起初,我認為可能有必要每 4 次迭代輪換一次,而不管密鑰大小如何,但閱讀文本和閱讀其餘程式碼,我認為這不是一個意圖。非常感謝!

由於問題中指出的原因,該問題的程式碼適用於 AES-128 和 AES-256,但實際上不適用於 AES-192。

是的,按照 OP 在評論中的建議更改if ( !( i % 36 ) )為足以使其(以及其餘程式碼)通過FIPS 197的附錄 A.2和C.2 的範例(以及 A.1、A.3、 C.1、C.3)。if((!(i%36)) && (key_words == 4))

讓我想起了DW Davies(不是同一個 Davies)和 WL Price(1987 年 5 月版)的*《電腦網路安全*性》一書,該書在 DES 的 S4 的最後一個常數中有錯字,導致某些測試向量失敗。這讓我在 1980 年代後期發瘋了一段時間。從那時起,我在標準的基礎上實現了加密。

引用自:https://crypto.stackexchange.com/questions/78403