Aes

AES密鑰擴展問題

  • February 22, 2022

我正在閱讀有關 AES 的密鑰擴展的資訊,但我似乎還找不到這個問題的答案。這本書提到了密碼密鑰和擴展密鑰(或密鑰表)。這是書中的算法:

procedure KeyExpansion(byte K[4][Nk], byte W[4][Nb (N r + 1)]) ? Nk ≤ 6
   for j = 0 to Nk − 1 do
       for i = 0 to 3 do
           W[i][j] ← K[i][j]
       end for
   end for
   for j = Nk to Nb (N r + 1) − 1 do
       if j mod Nk = 0 then
           W[0][j] ← W[0][j − Nk ] + S RD [W[1][j − 1]] + RC[j/Nk ]
           for i = 1 to 3 do
               W[i][j] ← W[i][j − Nk ] + S RD [W[i + 1 mod 4][j − 1]]
           end for
       else
           for i = 0 to 3 do
               W[i][j] ← W[i][j − Nk ] + W[i][j − 1]
           end for
       end if
   end for
end procedure

問題1:在第一行,這個程序是取鍵。這個函式需要接受的關鍵對像是什麼?看起來此密鑰已經具有 128 或 192 所需的 32 位字數(因為這是 6 列或更少列的密鑰擴展),但是您如何從使用者的隨機長度密碼中獲得它?PKCS7 是否已經執行以便填充密鑰?

問題 2:這是否表明使用者實際輸入的鍵是鍵表的一部分,還是表中的所有鍵都是從使用者的實際原始輸入鍵派生的?

看起來該密鑰已經具有 128 或 192 所需的 32 位字數(因為這是 6 列或更少列的密鑰擴展),但是您如何從使用者的隨機長度密碼中獲得它?

如何派生 128、192(或 256)位密鑰超出了 AES 規範。它將該鍵作為輸入;你做什麼來想出關鍵不是它關心的問題。

現在,我們通常不會將使用者的密碼直接轉換為密鑰;我們通常要麼從密鑰派生函式生成它(輸入可能包括密鑰交換操作的結果),要麼可能直接使用安全隨機數生成器的輸出(並設法以某種方式將此密鑰傳輸到另一方) . 直接使用使用者密碼的問題在於密碼是系統中最薄弱的部分——嘗試猜測密碼比破解 AES(或密鑰交換操作)容易得多。

這是否表明使用者實際輸入的密鑰是密鑰計劃的一部分,或者計劃中的所有密鑰都是從使用者的實際原始輸入密鑰派生的?

密鑰擴展生成 AES 使用的 11、13 或 15 個子密鑰(取決於密鑰大小)。最初的 1、3/2 或 2 塊將是直接從輸入的密鑰中獲取的位;但是,這對於 AES 的工作方式並不重要。

這個函式需要接受的關鍵對像是什麼?

一個字節數組。

你如何從使用者的隨機長度密碼中得到它?

通常的做法是使用基於密碼的密鑰派生函式 (PBKDF),如 PBKDF2、Bcrypt、Argon2、BalloonHash 等。請記住,它們不能增加輸入的強度。因此,使用者必須像使用 dicewire 方法生成的密碼一樣,選擇具有足夠強度的良好密碼。

在某些應用程序(如磁碟加密)中,會為磁碟加密生成一個統一的隨機密鑰,該密鑰是從使用者密碼派生的密鑰中加密的。不過,安全性取決於密碼的質量。

此外,密鑰材料可以是 DHKE 等密鑰交換的來源,在這種情況下,必須將 HKDF 之類的密鑰派生函式應用於密鑰材料以派生 AES 密鑰(字節)。

PKCS7 是否已經執行以便填充密鑰?

沒辦法,這不安全。如果您正在設計一個庫,如果使用者(程序員)的輸入比目標密鑰大小短,則拒絕它。

這是否表明使用者實際輸入的密鑰是密鑰計劃的一部分,或者計劃中的所有密鑰都是從使用者的實際原始輸入密鑰派生的?

應該使用 PBKDF 處理使用者的密碼以派生密鑰。密鑰計劃需要一個大小取決於首選 AES (128,192,256) 的密鑰數組。**密鑰表不區分密鑰材料的質量,**也不是其設計的一部分。關鍵材料的質量由使用者和圖書館負責。加密的庫應該使用良好的 PBKDF 處理密碼,並將輸出輸入到密鑰計劃中。這個過程必須獨立於使用者——除了一些關於密碼質量的警告。

一體;

  1. 從使用者那裡獲取密碼,如果密碼太短,則警告使用者。
  2. 使用 PBKDF 從密碼中導出所需的密鑰字節數組
  3. 為密鑰計劃提供派生的密鑰字節數組。

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