Encryption
在 CTR 模式下使用 IV 的完美方式
我了解在
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!