Aes

當我有共享私鑰時如何計算 IV?

  • March 25, 2012

我正在使用已安全協商私鑰的伺服器/客戶端系統。我需要加密/解密雙向傳遞的消息,通常在 100 字節到 100 KB 之間。我正在使用 AES-128 位,但我無法真正理解如何將私鑰與加密算法一起使用。

“每次加密時都應該使用唯一的 IV,它們應該是隨機的。”

基於前一點,當我只有雙方的安全密鑰時,如何計算伺服器和客戶端上的“唯一”IV?或者計算一個隨機的 IV 並通過網路發送 IV 是否可以?這不會打開一個安全漏洞嗎?

  • **數據:**小型消息,通常帶有重複數據。
  • **鑰匙:**我在兩邊都有一把安全鑰匙。
  • **IV:**不知道如何計算。密鑰派生?鹽漬雜湊?壓縮包?

好吧,首先,IV 具有與密鑰不同的安全屬性。使用鑰匙(如您所知),您需要將它們隱藏在中間的任何人面前;如果有人確實知道了您的密鑰,那麼他可以讀取您的所有流量。

IV 不是這樣的。相反,我們不介意中間有人知道 IV 是什麼;只要他不知道密鑰,他仍然無法對加密的流量做任何事情。因此,一種常見的做法是讓加密器選擇 IV,然後將其包含在加密消息中(通常緊接在密文之前)。這消除了一半的問題(解密器如何知道要使用哪個 IV;他從消息中得到它);攻擊者也可以看到 IV,但是(如上所述)我們並不關心這一點。

所以,問題歸結為“加密器如何選擇 IV”?好吧,依賴的答案在某種程度上取決於您使用的模式。根據您使用的是 CBC 模式還是 CTR 模式,IV 的要求會有所不同。

  • 對於 CBC 模式,您列出的語句大部分是準確的(儘管我會將其寫為“您每次加密時都應該使用唯一的 IV,並且它們必須是不可預測的”;已知針對可預測 IV 的攻擊;我不知道它們是否適用於您的場景,但如果我們根本不必擔心它們,通常會更安全)。有幾種方法可以做到這一點;加密安全的 PRNG(具有良好的播種)工作。我看到的另一件事是你拿一個計數器(比如第一條消息為 0,第二條消息為 1,等等),用你將加密消息的相同密鑰加密它(在 ECB 模式下),然後使用那個密文作為IV。這是可行的,因為任何不知道密鑰的人都無法預測計數器的 ECB 加密。當然,
  • 對於 CTR 模式,語句不太準確;它會更合適“每次加密時您必須始終使用唯一的IV;可預測性不是問題”。因此,通常使用計數器作為 IV。我們得到了唯一性(計數器顯然在密鑰的生命週期內從不重複),雖然它是可預測的,但我們在這裡並不關心。現在,有一個注意事項:唯一性要求不僅適用於 IV,它還適用於您提供給分組密碼的值。正因為如此,CTR 模式的一種常用方法是採用 16 字節的 AES 明文塊,並將其分成(比如說)一個 12 字節的 IV 欄位和一個 4 字節的消息索引欄位;在單個消息的加密期間,IV 欄位始終是我們用來加密/解密消息的 IV 值,並且我們加密的每個塊的消息索引欄位都會增加;例如,第一個塊為 0,第二個塊為 1,依此類推。

最後,雖然你沒有特別問過這個問題,但我相信需要提醒一下;通常,當我們加密消息時,我們通常還需要使用完整性檢查(以確保收到的消息就是發送的消息);即使您並不特別關心消息的完整性,攻擊者也有幾種巧妙的方法可以通過修改密文並查看接收者的反應來找到有關加密的資訊。簡短的回答是您應該包含一些完整性轉換(無論是 HMAC、CMAC,還是將整個加密操作替換為兼具隱私性和完整性的原語,例如 GCM 或 OCB)。但是,要充分討論這一點,需要的空間比我在回答另一個問題時應該佔用的空間要多。

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