書中可能出現的錯誤
所以我一直在閱讀這本書,名為“使用密碼學和 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 年代後期發瘋了一段時間。從那時起,我在標準的基礎上實現了加密。