使用主 AES 加密密鑰和一些純文字的密鑰派生?
我在 java 中使用 AES 128 位加密。我有一個加密密鑰和 10 位純文字。
我想使用 AES 加密密鑰和 10 位純文字為 HMAC 派生密鑰。在我的情況下,這個純文字將保持不變。
如何使用上述成分導出 HMAC 的密鑰。
更準確地說,請參考下圖:- 我如何才能從相應的輸入中獲取新密鑰。
NIST 定義了一些密鑰派生函式,可用於使用 NIST 推薦的 MAC 算法AES-CMAC或HMAC之一派生新密鑰。這些功能可以滿足您的需求。
這些函式在NIST SP 800-108: Recommendation for Key DerivationUsing Pseudorandom Functions中定義。
因為您打算使用 AES 加密密鑰進行使用 AES 算法的加密,所以您需要選擇不使用 AES 算法的密鑰派生機制,其方式可能與您對密鑰的使用發生衝突。為此,您可以選擇使用帶有 HMAC 算法的函式,例如使用 SHA-256 雜湊函式。(不要選擇 AES-CMAC。)
當使用 NIST SP 800-108 中的構造(計數器模式 KDF、回饋模式 KDF 或雙管道 KDF)時,明文可以是例如標籤,並且 AES 加密密鑰需要是KI。例如:
在計數器模式下使用 KDF,與
- h = 所需 HMAC 密鑰的長度
- r = 1
- KI = AES 加密密鑰
- 標籤 = 10 位純文字
- 上下文 = 空字元串或標識您的協議或密鑰使用目的的合適標識符。
順便說一句,不是從 AES 加密密鑰派生 HMAC 密鑰,更常見的是使用密鑰派生密鑰來派生所有必需的密鑰材料,即使用 KDK(密鑰派生密鑰),它為加密密鑰派生足夠的密鑰材料和 HMAC 密鑰。這種做法是值得推薦的,因為加密密鑰不用於兩個不同的目的:加密和密鑰派生。出於多種目的使用密鑰通常被認為是一種反向做法,因為它增加了攻擊者可能嘗試獲取有關密鑰資訊的方式。
即我建議你考慮這個
AES-CTR-KDK( KDK , plaintext-key ) = AES-key (前 128 位) || HMAC 密鑰(最後 256 位)。
$$ These are typical key sizes, customize the key sizes according to your needs. $$ 此外,在提出 KBKDF(基於密鑰的密鑰派生函式)時,我假設您使用 10 位明文不用作身份驗證的 PIN。然後要小心,因為攻擊者可能會暴力破解密鑰空間 $ 10^{10} $ .