Encryption

Rijndael 的密鑰調度如何查找 128 位以外的密鑰大小?

  • April 30, 2012

在維基百科中說:

$$ …. $$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} $ 在我們的範例中),這將用於在低記憶體設備上進行解密。

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