Encryption

如何驗證 AES 密鑰?

  • March 1, 2017

我正在使用 AES-128 位加密對數據進行加密。我需要檢查接收方的密鑰是否正確。我怎樣才能做到這一點?

假設在接收方要求使用者輸入密鑰進行解密。據我所知,提供錯誤的密鑰會產生一些亂碼數據。如何防止這種情況並向使用者報告提供的密鑰不正確?

在 GCM 模式下使用 AES 128。這將在加密期間生成一個標籤。將該標籤與密文一起發送給接收者。如果接收方使用錯誤的 AES 密鑰對其進行解密,則發送的標籤和接收方計算的標籤將不同。提醒您的使用者 AES 密鑰不正確或加密數據已損壞。

您確實可以使用 DeepSpace101 建議的身份驗證模式,但它的缺點是如果數據很大並且最後一部分失去,您可能看不到失去數據和輸入錯誤密鑰之間的區別。它還會減慢驗證速度,因為您需要在比較密鑰之前驗證所有數據(不,這不會阻止攻擊者)。

另一種方法是使用 KCV,大多數情況下是零塊加密。這樣做的缺點是您不想使用另一個零塊加密;所以在我看來這太危險了。您也可以在密鑰上使用散列作為 KCV,但這顯示了另一個問題(之前有缺陷的嘗試已經存在):如果您重用密鑰,那麼散列將是相同的。

所以所有這些事情充其量都是次優的。我會建議另一個:使用 KBKDF,例如 HKDF,並提供鹽和帶有密文的派生密鑰值。使用鹽和輸入鍵作為 KBKDF 的輸入併計算派生值。然後將其與密文儲存的派生值進行比較。請注意,KDF 是不可逆的,因此這不應給攻擊者任何優勢(但請注意,記憶體中需要密鑰值才能執行此操作)。

請注意,如果您想防止主動攻擊者,您需要在經過身份驗證的數據中包含鹽和雜湊(用於經過身份驗證的 AAD 數據/AEAD 密碼)。當然,如果通過替換先前的鹽/派生值來重用密鑰,那麼活躍的攻擊者仍然可能讓您相信您的數據而不是密鑰有問題 - 這是無法避免的。

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