隨機初始化的全域計數器,用於加密第 k 條消息IV=IV+kmod2nIV=IV+kmod2noperatorname{IV} = operatorname{IV} + k hspace{5mm} mod hspace{5mm} 2^n
對於分組密碼,使用遞增的 IV 是不安全的。也就是說,對第一條消息使用隨機 IV $ \operatorname{IV} + 1 $ 對於第二個, $ \operatorname{IV}+ 2 $ 對於第 3 次等。如何建構攻擊以表明這種模式不安全?
分組密碼本身沒有初始化向量的概念。 但是隨機或有狀態的消息密碼可能。如果你正在建構一個應用程序,你應該完全忘記“分組密碼”的概念:一些密碼魔法是由一個名稱拼寫為 AES 的偽隨機排列族建構的這一事實對你來說並不重要;結果的安全契約,包括你的義務和你換來的安全,才是最重要的。
- 對於像 AES-CBC 這樣的隨機密碼,您在安全合約中的義務是選擇不可預測的 IV 。
如果給定第一條消息的 IV,對手可以猜出第二條消息的 IV,則安全合約無效。這個錯誤在 2009 年被利用來恢復 ssh 會話中的明文$$ 1 $$(免費)。
- 對於像 AES-CTR 這樣的有狀態密碼,您在安全合約中的義務通常是選擇唯一的隨機數,您可以通過計數來做到這一點。(“nonce”,表示使用過一次的數字,有時被稱為“IV”,但一些作者——比如這個作者——更喜歡將“IV”這個詞保留給不可預知的人。)
只要發送者從不重複隨機數,對手是否可以提前預測隨機數並不重要。作為獎勵,您可以通過讓接收器要求 nonce 是連續的來立即檢測有問題的實現。
人們總是可以安全地使用狀態來為隨機密碼選擇 IV,方法是通過迄今為止消息數量的偽隨機函式推導它;並且可以為有狀態密碼隨機選擇一個隨機數,但有隨機數衝突的風險,所以它不是那麼安全。
綜上所述,您應該真正使用經過身份驗證的消息密碼。即使對手無法通過竊聽來讀取加密消息中的秘密,但如果沒有身份驗證,您可能會根據對手控制的輸入採取行動,從而導致秘密洩露。已驗證密碼的範例包括:
- AES-GCM,帶有 96 位隨機數的消息序列號;
- NaCl crypto_secretbox_xsalsa20poly1305,具有消息序列號或統一隨機隨機數,因為 192 位隨機數足夠大,可以安全地隨機隨機選擇;或者,
- 如果必須使用 AES-CBC,至少在 encrypt-then-MAC 組合中使用 HMAC-SHA256 或類似方法,並且發送者必須為每條消息選擇不可預測的 IV。
如何建構攻擊以表明此模式不安全?
我假設你問的是 CBC 模式(你沒有具體說明),雖然這聽起來像是一個家庭作業問題,但作業已經到期了,所以我只會給你答案。
你要做的是要求加密三個連續的消息,第一條消息的第一個塊有值 $ X $ ,第二條消息的第一個塊有值 $ X \oplus 1 $ 第三條消息的第一個塊具有值 $ X $ . 沒關係 $ X $ 是,其餘的消息是什麼並不重要。
由於 CBC 的工作方式,三個加密消息的第一個塊是值:
$$ AES_k( IV \oplus X ) $$
$$ AES_k( (IV+1) \oplus (X \oplus 1)) $$
$$ AES_k( (IV+2) \oplus X) $$
如果 lsbit 的 $ IV $ 恰好為 0,則 $ IV+1 = IV \oplus 1 $ (因為加法中的內部進位不會傳播到 lsbit 之外),所以 $ (IV+1) \oplus (X \oplus 1) = IV \oplus X $ ,即第一和第二密文消息的初始塊相同,可以測試。
如果 lsbit 的 $ IV $ 恰好是 1,那麼 lsbit 的 $ IV+1 $ 將為0,所以我們有 $ (IV+2) \oplus X = ((IV+1) \oplus 1) \oplus X = (IV+1) \oplus (X \oplus 1) $ 所以第二條和第三條密文消息的初始塊相同,也可以測試。
因此,這表明該構造不符合 IND_CPA 安全性。