AES密鑰擴展問題
我正在閱讀有關 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 處理密碼,並將輸出輸入到密鑰計劃中。這個過程必須獨立於使用者——除了一些關於密碼質量的警告。
一體;
- 從使用者那裡獲取密碼,如果密碼太短,則警告使用者。
- 使用 PBKDF 從密碼中導出所需的密鑰字節數組
- 為密鑰計劃提供派生的密鑰字節數組。