Rijndael 的密鑰調度如何查找 128 位以外的密鑰大小?
它在維基百科中說:
$$ …. $$Rijndael 可以使用 32 位的任意倍數的塊和密鑰大小來指定,最小為 128 位。塊大小最大為 256 位,但密鑰大小沒有理論上的最大值。
密鑰調度如何查找這些其他密鑰大小,例如 136 位密鑰?
Rijndael(AES 背後的算法)指定塊大小和密鑰大小為 128、160、192、224 和 256,可以任意組合塊和密鑰大小。(因此,維基百科的錯誤在於密鑰大小在這裡沒有理論上的最大值,儘管可以發明允許更長密鑰的密鑰調度算法的擴展。請參閱下文了解詳細資訊。我現在也在 Wikipedia 上修復了這個錯誤的聲明。)
在這 25 種組合中,只有塊大小為 128 位(16 字節)和密鑰大小為 128、192 和 256 位(16、24 和 32 字節)的組合被標準化為高級加密標準。如果您使用 Rijndael 的任何其他變體,則您沒有實現 AES。
對於普通文件加密,沒有理由使用任何其他變體,128 位密鑰和塊大小就足夠了(當使用合理的操作模式時)。
那麼,關鍵時間表是怎樣的呢?
(對於以下內容,一列是一組 32 位(= 4 字節)。)
一、從塊大小 $ N_B $ 和輪數 $ n_r $ 我們計算輪密鑰需要多少密鑰材料(它是 $ N_B · (n_r + 1) $ .) 密鑰調度不再需要塊大小。按列計算。例如,在 128 位塊和 160 位密鑰的情況下,您使用 11 輪,因此需要 $ 4 · (11+1) = 48 $ 圓形鍵列。
我們寫入與密鑰大小一樣多的列 - 例如,對於我們的 160 位密鑰,我們將這些寫為
k_0 k_1 k_2 k_3 k_4
這些是輪密鑰的前五列(即第一輪密鑰和第二輪密鑰的一列)。作為下一步,我們應用非線性函式 $ f_1 $ 的關鍵時間表 $ k_4 $ , 和異或 ( $ \oplus $ ) 結果與 $ k_0 $ 要得到 $ k_5 $ :
┏━━━┓ k_0 k_1 k_2 k_3 k_4 ─→┃f_1┃─╮ │ ┗━━━┛ │ ╭──│──────────────────────────────────────╯ │ ↓ ╰─→⊕ │ ↓ k_5
我描述了 $ f_i $ 在回答您的另一個問題時。
要生成以下輪鍵列,我們只需計算 $ k_n = k_{n-1} \oplus k_{n-5} $ (因為這裡的鍵大小是五列),直到我們來到 $ k_{10} $ , 我們必須使用的地方 $ k_{10} = f_2(k_9) \oplus k_5 $ . 我們重複這個直到我們到達 $ k_{47} $ (因為我們只需要 48 列的輪密鑰材料),然後我們可以停止。
┏━━━┓ k_0 k_1 k_2 k_3 k_4 ─→┃f_1┃─╮ │ │ │ │ | ┗━━━┛ │ ╭──│──────│──────│──────│──────│──────────╯ │ ↓ ↓ ↓ ↓ ↓ ╰─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕ │ │ │ │ │ │ │ │ │ ↓ │ ↓ │ ↓ │ ↓ │ ↓ ┏━━━┓ k_5 ─╯ k_6 ─╯ k_7 ─╯ k_8 ─╯ k_9 ─→┃f_2┃─╮ │ │ │ │ | ┗━━━┛ │ ╭──│──────│──────│──────│──────│──────────╯ │ ↓ ↓ ↓ ↓ ↓ ╰─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕ ╭─→⊕ │ │ │ │ │ │ │ │ │ ↓ │ ↓ │ ↓ │ ↓ │ ↓ ┏━━━┓ k_10 ╯ k_11 ╯ k_12 ╯ k_13 ╯ k_14 ─→┃f_3┃─╮ │ │ │ │ | ┗━━━┛ │ ╭──│──────│──────│──────│──────│───────────╯ │ ↓ ↓ ↓ ↓ ↓ ........................................... │ ↓ ↓ ↓ ╰─→⊕ ╭─→⊕ ╭─→⊕ │ │ │ │ │ ↓ │ ↓ │ ↓ k_45 ╯ k_46 ╯ k_47
因此,它就像 128 位密鑰的密鑰調度,但多一列。
當我們實際上必須使用輪密鑰進行加密時(請記住,在此範例中,塊大小為 128 位,即 4 列),我們使用 $ k_0 \dots k_3 $ 作為第零輪密鑰(即在第一輪之前), $ k_4 \dots k_7 $ 作為第一個,……和 $ k_{44} \dots k_{47} $ 作為最後一個(第11輪之後)。
密鑰調度對其他密鑰大小的工作方式類似,但對於大於六列的密鑰大小(即七或八 - 未指定更多),還有第二個非線性函式 $ g $ (簡化版 $ f_i $ )在每行的前四列之後(有關8 列的範例,請參見我之前的答案,即 AES-256)。
要將這個想法擴展到大於8 列(256 位)的密鑰大小,必須定義更多列會發生什麼 - 使用第三個非線性函式 $ h $ , 利用 $ g $ 再次,什麼都不做?這個定義不是由設計者完成的,因為 265 位的密鑰大小對於人類歷史的其餘部分似乎已經足夠了。
整個密鑰調度可以即時完成(即在加密塊時),這通常在記憶體有限的實現中完成,他們不想將整個 167 字節(對於 AES-128)保存到 240 字節(對於 AES-256)在記憶體中。在“正常”實現中,您將計算一次密鑰調度並為每個塊重複使用它(因為您通常使用相同的密鑰加密多個塊)。
甚至可以向後計算關鍵時間表(從最後幾列開始,即 $ k_{43} $ 至 $ k_{47} $ 在我們的範例中),這將用於在低記憶體設備上進行解密。