Aes

使用錯誤的加密密鑰解密 AES256-CBC

  • December 29, 2020

使用 OpenSSL 庫是否有機會使用錯誤的加密密鑰解密 AES256-CBC 加密數據而不會出錯?

問這個是因為我在某處讀過有 1/256 的機會解密損壞的數據不會產生錯誤

是的,這是正確的,解密更改的密文數據或使用錯誤密鑰的數據可能會導致錯誤的明文而不會產生錯誤。實際上,這個機會略大於 1/256。


首先,我們需要假設數據仍然是塊大小的倍數。如果不是,那麼它根本不會解密。

此外,如果密鑰是正確的,並且最後一個(以及倒數第二個)密文塊的最後幾個字節是正確的,那麼即使第一個塊中的結果數據可能不正確,解密也不會失敗。

如果數據是塊大小的倍數,那麼 AES-CBC 解密將永遠不會失敗。但是,OpenSSL 預設使用 PKCS#7 填充- 也就是說,如果使用高級EVP功能而不是低級 AES 功能。這意味著明文數據在加密之前總是被填充,即使數據是塊大小的倍數。順便說一句,對於 OpenSSL 的命令行界面也是如此。


在 PKCS#7 unpadding 期間,01如果密鑰不正確或最後一個密文塊不正確,則最後一個塊的解密有 1/256 的機會結束。

但是,最後一個塊也有可能以02 02它也是有效的填充結尾。然而,發生這種情況的可能性僅為 1/65536,因此與最後一個解密塊以 . 結尾的可能性相比,它幾乎可以忽略不計0103 03 03當然,更是如此04 04 04 04。由於必須始終根據 PKCS#7 執行填充/取消填充,因此接受隨機密文塊的機會接近 1/256。


對手總是可以更改任何密文塊直到最後一個,因為 CBC 的錯誤傳播屬性僅限於目前塊和(部分)下一個塊。您需要對密文進行身份驗證以避免這種情況**,並避免在適用的情況下填充 oracle 攻擊。為此,在 IV 和密文上計算 HMAC 或將模式切換到例如 GCM 並在解密前執行必要的驗證。

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