Encryption

CBC模式究竟是如何使用初始化向量的呢?

  • April 27, 2016

據我了解,CBC 模式下的 AES 對 128 位初始化向量和前 128 位純文字進行異或運算。這個對嗎?

我在 aes-256-cbc 模式下使用 PHP 5.3 openssl 擴展。我正在嘗試往返,即加密然後解密以確保我取回原始字元串。

我發現如果我使用一個初始化向量加密並使用另一個初始化向量解密,使用相同的密鑰,前 128 個解密位已損壞(如預期的那樣),其餘的是正確的純文字。

我發現如果我用一個初始化向量加密,並用一個幾乎不同的初始化向量解密,解密顯示幾乎沒有不同的純文字。也就是說,當我更改初始化向量的第三個字節時,解密後的純文字顯示第三個字節損壞,其他一切都正確。

這似乎確實顯示了初始化向量如何影響 AES 密碼塊連結。初始化向量是否與純文字的前 128 位簡單異或,僅此而已?

相關維基百科頁面中的模式確實解釋了這一切:

CBC加密

CBC解密

正如您在解密模式中看到的,IV 用於產生第一個明文塊的單個 XOR;很明顯,IV 只影響該塊。但是,在加密時,修改 IV 會更改第一個密文塊,然後是第二個密文塊,依此類推。


CBC 的作用是隱藏明文塊中的冗餘。塊密碼是確定性的:用相同的密鑰對相同的輸入塊加密兩次,得到相同的輸出。現實世界的明文數據有冗餘塊;如果不採取任何措施,這會導致可檢測到的洩漏,例如在ECB 模式下(著名的企鵝圖片清楚地說明了這個問題)。CBC 通過在加密之前“隨機化”輸入塊來解決這個問題,這是通過將每個塊與前一個塊的密文進行異或運算來完成的:假設塊密碼的輸出足夠隨機,可以有效地盡可能避免輸入塊重複。

由於第一個塊沒有“前一個塊”,因此需要 IV 才能啟動模式。它是一個合成的“第零塊”。

如果您採用 CBC 加密的數據並簡單地翻轉第n塊中的第**k位,那麼在解密時,這將導致用亂碼垃圾替換第n明文塊,並準確翻轉第k位在第n+1個明文塊中;沒有其他任何改變。(這也凸顯了擁有MAC對於阻止惡意更改非常重要;即使不知道密鑰,攻擊者也可以通過修改密文來相當精確地控制他們可以對結果明文執行的操作。)

關於 CBC 是一種使每個密文位都依賴於所有明文位的方法,有一個普遍的神話。這是一個神話;CBC 不這樣做,也從未打算這樣做。

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