Aes

使用 GZIP 避免填充相關攻擊是否安全

  • September 24, 2013

我正在設計一個支持在 CBC 模式下使用 AES 加密一些記憶體數據的庫。現在我需要一個填充,但在我看來,Apple 的 CommonCrypto 庫和 OpenSSL 具有不同的填充方案,但即使在混合 CommonCrypto 實現和 OpenSSL 實現時,我也希望保持互操作性。(我的庫應該在只有 OpenSSL 的 Linux、只有 CommonCrypto 的 iOS 和兩者都有的 OS X 下工作。)

鑑於我的庫已經有 gzip 並且 gzip 存檔仍然可以取消存檔,並且在它之後連接任何字節字元串,我正在考慮這種填充方案:

  1. Gzip 傳入的數據。
  2. 將此存檔與隨機字節連接,以使長度達到 AES 塊邊界。

解密時,gzip 算法會自動丟棄附加的隨機字節。

您基本上是在使用 gzip 來傳達給定消息的長度。只要您的 AES-CBC 實現是安全的(例如,通過使用隨機 IV),那麼給定的方案就應該可以防止填充預言攻擊。這很容易證明,因為沒有任何東西可以從明文中刪除填充。

CBC 填充通常不會為分組密碼模式增加任何安全性。如果您已經知道明文的大小,則可以只填充零字節。從這個意義上說,只要在解密後沒有資訊洩露給攻擊者,該方案就是安全的。請注意,使用 gzip 可能會影響明文的大小,因此您需要確保攻擊者無法從密文的大小中學到太多東西。

因此,如果攻擊者只能訪問密文,您的方案是安全的。在這種情況下,它確實提供了保密性。

所以現在壞消息…

這並不意味著密文容器中的數據不能被更改。由於不存在加密安全的身份驗證標籤,攻擊者很可能能夠以無法檢測到的方式更改密文。因此,處理解密數據的應用程式碼仍然可能被欺騙而洩露有關純文字的資訊。

換句話說,儘管您現在已經成功地防止了填充預言攻擊,但您還沒有保護自己免受對密文的類似*主動攻擊。*請添加某種安全身份驗證標籤。到目前為止,這是保護自己免受此類主動攻擊的最佳方式。

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