Aes
關於 IV/初始化向量的問題
我找到了一些程式碼來讓crypto-js 加密瀏覽器中的數據,並且使用 SO 上某人的指針,它現在也可以解碼數據。
我的下一個問題是關於 IV 的使用;是像鹽一樣需要從加密安全的 RNG 生成的 IV,還是任何數據都喜歡時間戳?
從我的閱讀來看,IV 不需要保密 - 如果您的 IV 長度為 16 個字節,那麼您獲取這 16 個字節,將要加密的文本附加到它上面,然後可以發布 IV 和密文。解密時,您將檢查純文字的前 16 個字節是否與 IV 匹配,然後將它們從生成的純文字中丟棄。
我是否正確理解這一點?任何唯一數據(對於每個密文)是否對 IV 有用,或者我是否應該尋找一種以安全方式生成 IV 的方法(在客戶端,這意味著它可能被替換)?
謝謝!
PS - 這是針對個人項目/學習體驗,而不是宣傳為安全的產品:)
這取決於您使用的加密模式:
- 對於 CTR、CFB 和 OFB 模式,IV 只需要對於使用相同密鑰加密的每個密文都是不同的。(對於少於全塊回饋的 CFB 和 OFB 模式,也應避免某些“弱 IV” 。)
- 對於 CBC 模式,IV 需要不可預測。 實現這一目標的一種方法是隨機生成 IV,儘管其他方法(例如使用原始 AES 分組密碼加密計數器 - 最好使用單獨的密鑰,如果攻擊者有可能控制計數器 - 和也可以使用結果作為 IV)。
無論如何,IV 不需要保密。如果它必須是秘密的,它將被稱為密鑰。
還要注意,上面提到的傳統加密模式都不能安全地抵禦選擇密文攻擊(即攻擊者修改密文,或用整塊布編造假密文並將其發送給接收者以查看會發生什麼的攻擊)。特別是,它們(尤其是 CTR 和 OFB)都具有延展性,因此可以翻轉密文中的位的攻擊者可能能夠翻轉明文中的相應位。不受保護的 CBC 模式也容易受到填充預言攻擊,除非特別注意防止它們(即使那樣,它仍然具有一定的可塑性)。
為了保護您的消息不被修改並避免此類選擇密文攻擊,您需要使用經過身份驗證的加密模式,或在加密後(和在解密之前驗證它)。