Encryption

在 CTR 模式下使用 IV 的完美方式

  • February 1, 2015

我了解在CTR mode. 我正在考慮在生成後將密鑰與 IV連接起來的情況,並將生成的字節數組以安全的方式發送到接收方。

創建一個 32 字節數組是否可行,這樣前 16 字節用於儲存密鑰,最後 16 字節用於儲存 IV 並將結果發送到接收方?

將IV與密鑰一起發送根本沒有太大意義。IV 的整個想法是每個鍵都是唯一的。但是如果鍵每次都改變值,那麼任何 IV 都是唯一的。

因此,您可以使用靜態 IV,甚至可以使用由全零組成的 IV。在這種情況下,您只需要擔心您不會在協議中的其他位置重用密鑰。例如,對於 CTR 模式,您不應使用通過加密由全零組成的塊生成的密鑰檢查值,因為它會洩漏結果密鑰流的初始塊。

但是,使用密鑰執行操作以派生 IV 並不是一個好主意。如果您需要與給定秘密分開的密鑰和 IV,請使用 KBKDF(例如 HKDF)從秘密中單獨計算密鑰和 IV。

如果您的密鑰沒有改變,儘管上面給出了協議,那麼只需在密文前面加上一個唯一的(加密安全的隨機)IV。這也應該是故障安全預設值。還應考慮使用經過身份驗證的密碼,如 GCM 或 EAX。


編輯

通過安全通道將秘密值發送到另一端通常不是一個好主意。應事先建立會話密鑰,最好使用密鑰協商算法來提供前向安全性。通過安全通道發送密鑰聽起來很容易,但如果您已經擁有一個安全通道,則不需要會話密鑰來建立新通道。

通常,您會按照 fgrieu 的建議將 IV 添加到密文中。但是也可以將 IV 與密鑰一起發送,以防它們綁定到發送的消息。

在發送具有相同密鑰但當然不同 IV 的多條消息時,您通常會使用前置。因此,密鑰只需安全發送一次,而您不需要對 IV 進行額外保護。

但請記住,在加密不同的消息時,切勿重複使用具有相同密鑰的 IV!

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