Aes

從 AES-GCM 的 DH 共享密鑰中導出 IV 的安全方法?

  • April 10, 2020

我準備用AES-GCM做一個安全的通信程序。這是程序

  1. DH 密鑰交換以獲取共享密鑰
  2. SHA256(共享密鑰)
  3. 使用 AES-GCM 加密消息,而密鑰只使用一次。

但是,我對在第 3 步中獲取 IV 的方式感到困惑。我知道 IV/nonuse 必須是唯一的。IV 的大小應為 96 位。我知道我們可以使用時間戳來生成 iv。但是,我需要從共享密鑰生成 IV。有什麼方法可以安全地做到這一點嗎?

如果沒有監管要求,對於 AES-128,一個不錯的選擇是將 SHA-256 散列拆分為密鑰(128 位)、IV(96 位)和任何未使用的部分。這使我們能夠使 IV 隱含(並且是秘密的,這是不必要的,但不會造成傷害),從而節省了很少的頻寬。對於 AES-192 或 AES-256,我們可以使用 SHA-512 而不是使用 SHA-256。

在相關說明中,請確保給定方永遠不會使用相同的派生密鑰來加密和解密/身份驗證,因為這會引發鏡像攻擊。如果通信是雙向的,則可以使用派生 $$ \operatorname{HMAC-SHA-xyz}(\mathsf{key}=\text{DH-shared-secret}, \mathsf{message}=\text{sender-ID}) $$ 作為會話密鑰的來源和發送方用來準備其消息的 IV。如果共享密鑰超過一定大小(SHA-256 為 64 字節),HMAC 會在內部對共享密鑰進行雜湊處理,這很好。

為了更強有力的保證: $$ \begin{align} \text{Key}&=\operatorname{HMAC-SHA-xyz}(\mathsf{key}=\text{DH-shared-secret}, \mathsf{message}=\text{‘K’}\mathbin|\text{sender-ID})\ \text{IV}&=\operatorname{HMAC-SHA-xyz}(\mathsf{key}=\text{DH-shared-secret}, \mathsf{message}=\text{‘I’}\mathbin|\text{sender-ID}) \end{align} $$

這給出了一個論點,即即使散列存在一定程度的缺陷,IV 的洩漏(即使 IV 沒有以明文形式發送也應該假設)不會損害 Key 的保密性。此外,HMAC 有一個參數(現在顯示)來指定輸出大小,使定義更清晰。

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