CTR&GCM 操作模式下的 IV/Nonce
我們知道重複使用 IV 會危及我們的保密性。我有一些問題旨在澄清 IV/Nonce 在 CTR/GCM 中的使用:
- 如果我們使用隨機 IV 加密每個純文字,是否可以在經過身份驗證的加密 (GCM) 和僅機密加密 (CTR) 中使用相同的密鑰來加密純文字?以這種方式我們可以重複使用同一個密鑰多少次?
- CTR 或 GCM 模式下的“IV”和“nonce”有什麼不同?(我知道算法中有一個計數器,但是在計數器之前有一些 IV 來加密每個塊。從 Wikipedia 中,我認為正確的術語是 IV+counter 而不是說 nonce?)
- 為 CTR 或 GCM 模式生成 IV 的正確方法是什麼?我們應該使用 TRNG 還是 CSPRNG?一些評論暗示 nonce 不應該是隨機的 - 為什麼會這樣?
IV(初始值或初始化向量)是一個模糊的術語,用於描述一種雙方都知道的操作模式的起始值,並且通常與加密數據一起以明文形式發送(並且攻擊者知道)
許多操作模式下的 IV 對該模式都有特定的要求。在某些模式中,要求是不可預測的並且(很有可能)不被重用。對於這些模式,最簡單的 IV 生成方法是 CSPRNG,由於隨機數的性質,這種方法可能會發生 IV 重用。對於 CTR 和衍生品,IV 必須是 nonce,這是一種非常特殊的值類型,並且通常在這些模式中被稱為我們,以防止混淆要求。NIST 在 GCM 規範文件中使用了這兩個名稱,但要求很明確。
生成不可預測且唯一的 IV 的另一種方法是使用不同的密鑰加密計數器值。這些是塊大小的長度。
一個隨機數(只使用一次的數字)絕不能與相同的密鑰(因此得名)重複使用,因為它是分組密碼的明文輸入。使用 nonce 而不是隨機數的模式包括 OFB、CTR 和 CFB。CTR 對 nonce 的不可預測性沒有要求。CTR 的隨機數通常是從 1 開始的順序消息計數器。這也允許在某些應用程序中輕鬆驗證消息沒有被多次接收(重放攻擊)。塊計數器用於每個消息中的塊。如果隨機數是隨機選擇的,重疊的機率會隨著每個加密塊的增加而增加;如果保存並驗證每個 nonce 的記錄以確保它不被重複使用,這不是問題。
CTR 模式一般使用 96 位隨機數,剩餘 32 位用於塊計數器。在必須增加 nonce 之前,這為每個 nonce 提供了 64GiB 的輸出塊,這對於大多數用途來說已經足夠了。CTR 輸出的安全限制是具有給定密鑰的分組密碼輸出的安全限制,對於 AES,最大為 $ 2^{128/2} $ 塊。
對 GCM 特定的 nonce 的另一個要求是它不是全 0 位,因為它用於 GHASH,並且使用它可能允許偽造所有身份驗證標籤。這個值本質上是 GHASH 函式的 IV,它對每個密鑰/分組密碼組合都是唯一的。
當在 GCM 中與 GHASH 一起使用時,CTR 模式具有更有限的安全輸出,這取決於隨機數的大小以及身份驗證標籤的大小。標籤越小,在攻擊成功之前可以傳輸的消息就越少。此外,對相同的密鑰使用不同的標籤長度可能會導致安全性損失。有關對短隨機數的攻擊的詳細資訊,請參閱GCM 中的身份驗證弱點。對於 GCM 最大明文長度為 $ 2^{39} - 256 $ 給定隨機數的位。
我認為在 GCM 和 CTR 中使用相同的密鑰沒有任何問題,只要沒有隨機數重疊,並且您保持在 AES 的安全塊限制範圍內,以及 GCM 身份驗證標籤生成的安全限制範圍內單個密鑰,並且從不加密全 0 輸入。NIST 關於密鑰和隨機數生成的 GCM 特殊出版物 (800-38D) 確實指定密鑰只能用於 GCM 而不能用於其他模式,我傾向於遵循這個建議。
- 可以,只要您遵守所有總使用限制並適當選擇 IV(見下文)。
- 雖然 IV 是任何初始化向量的通用術語,但最近的趨勢是使用術語“IV”來指代隨機向量,並使用“nonce”(“ n- number used once ”的縮寫)來指代輸入不需要隨機但不能重複的向量。在每種情況下,我們都假設允許對手學習它,在某些攻擊模型下,我們甚至讓對手選擇它。如果人們查看一種操作模式的安全聲明,他們通常會根據對 IV 的一些假設來展示他們的結果。在計數器模式或其衍生物(其中 GCM 是其中之一)的情況下,我們假設 IV 是隨機數。
- 這個問題與第 3 點重複,並且有一個很好的答案。
所以,它的要點是:CTR 要求每次加密都有一個唯一的隨機數,允許對手知道或預測。我們如何實現這一點?好吧,最簡單的方法是在主算法之外維護一個計數器(這與模式中使用的內部計數器不同)。也就是說,每次加密更多數據時,也會增加隨機數。通過這樣做,您知道該值確實是一個隨機數,直到它翻轉時您必須更改密鑰。
為什麼隨機 IV 對此不起作用?總之,因為生日綁定。如果我們隨機選擇一個 $ n $ 位四,大致經過 $ 2^{n/2} $ 已經選擇了 IV,我們希望生成一個不是新的 IV。這顯然不是一個隨機數,導致該模式的安全性崩潰。在 GCM 的情況下,這意味著您不能期望安全性超出 $ 2^{96/2}=2^{48} $ 使用隨機 IV 時的消息。