Nonce
具有靜態密鑰和動態鹽的 AES-GCM 是否可以安全地重用 IV/nonce
問題:希望以安全的方式使用具有相同密鑰的 AES-GCM 加密消息/對象/文件,但希望以分佈式/無狀態方式進行,因此以前使用相同密鑰的加密的 IV 是未知的,並且我知道如果使用隨機 IV,AES-GCM 對許多消息並不那麼安全。
此解決方案的範例是否安全?
- 為每個加密生成 16 字節隨機鹽 (16-BYTES-RANDOM)。
- TMP-AES-16-BYTES-KEY = HKDF-EXPAND-SHA1(靜態-AES-KEY-16-BYTES | 16-BYTES-RANDOM,16)
- 首先在消息中寫入隨機生成的 16 個字節。
- 使用 TMP-AES-16-BYTES-KEY 驗證前 16 個隨機字節並加密秘密數據並使用 12 個字節 IV 全零添加標籤。
解密相反 - 從消息隨機和秘密密鑰中派生臨時密鑰。
在您的描述中,AES/GCM 始終與新的密鑰一起使用,與以前的所有密鑰不同。因此,您不會使用相同的密鑰重用 IV。從這個意義上說,從安全的角度來看,這應該沒問題。
然而,這似乎過於復雜,並引出了一個問題:為什麼?簡單的方法是“按原樣”使用靜態密鑰並為每條消息使用隨機 IV。
GCM 實際上是為所有 IV 大小定義的 $ 2^{64}-1 $ 位。當使用受控單調計數器(如消息序列號)作為 IV 時,建議使用 12 字節的 IV,因為它保證了不可重用。但是,當使用隨機 IV 時,如果您使用 16 字節或更多的更大的 IV,IV 重用的機率實際上是最低的。當 IV 的長度不完全是 12 字節時,GCM 規範要求使用其內部的、鍵控的軟散列函式(稱為 GHASH)進行第一次散列。作為一個額外的好處,內部 IV 重用,由於整個 128 位空間,這將變得非常不可能,此外,由於 GHASH 是鍵控的,因此對旁觀者“隱藏”。並非所有 GCM 實現都支持大於 12 字節的 IV 大小,但是,為什麼要使用糟糕的實現呢?
總而言之,雖然您的建議似乎沒有明顯缺陷,但存在一個更簡單、更標準的解決方案:只需按原樣使用您的密鑰和隨機 IV。最好將 IV 大小增加到 16 個字節。