選擇填充方案以防止 CBC 填充 oracle 攻擊?
我正在觀看關於 CBC 模式分組密碼的填充預言攻擊的講座,其中使用的填充方案是 PKCS#7。
我的問題是僅通過選擇合適的填充方案就可以防止填充預言攻擊(不使用任何 MAC)嗎?
在講座中,攻擊首先找到明文的實際填充將是什麼。我假設講座中概述的其餘攻擊之所以有效,只是因為 PKCS#7 是一種可預測的填充方案。這意味著一旦對手收到BAD_PAD錯誤,他就會知道只有一個可能的焊盤是正確的焊盤。
如果使用的填充方案是不可預測的,那麼 CBC 模式對填充預言攻擊是否安全?
我正在考慮以下填充方案:
選擇不同的隨機字節 X 和 Y,每次加密消息時它們都會有所不同。用 X 和至少一個 Y 的副本填充。因此,如果塊長度為 8 個字節並且您的消息是 ABCD,您可以將塊填充為 ABCDXYYY、ABCDXXYY 或 ABCDXXXY。
這種填充方案會防止填充預言攻擊嗎?因為現在當攻擊者收到BAD_PAD錯誤時,他將無法確定正確的 pad 應該是什麼。
填充預言攻擊不是填充方案的錯!它們不是通過更改填充來修復的!通過不洩露有關解密結果的部分資訊,或者(最好)僅使用 CCA 加密來修復它們。
任何時候你向對手提供這個:
* Accept arbitrary c * Decrypt m = Dec(c) * Reveal formatcheck(m)
…如果它只是一個 CPA 安全的加密方案,你會破壞加密的所有安全性。格式檢查的細節並不重要。一些填充方案(更一般地說,“格式檢查”)可以或多或少地直接進行明文恢復攻擊,但都會在一定程度上破壞整體安全性。
是的,您可以創建一個無法被填充預言攻擊的填充方案(用於塊密碼操作模式)。建構這樣的方案相對容易。例如,您可以有一個填充始終正確的函式。例如,對於 AES,您可以說填充是最後一個字節模數 16 + 1 的值。如果沒有填充錯誤,則根據定義,填充預言是不可能的。
問題是攻擊者仍然有可能更改明文。填充不用於驗證密文的正確性。然而,這也意味著在進一步處理更改的明文期間的任何錯誤都可能導致錯誤。猜猜看:這也可能向攻擊者洩露資訊。
這表明填充預言攻擊是對明文處理的攻擊的一部分。換句話說:填充預言機攻擊是一種特定的明文預言機攻擊。原始消息上的明文預言可能與填充預言攻擊一樣糟糕。
可以很容易地證明,通過簡單地將填充嵌入明文本身,不同的明文預言機可能與填充預言機攻擊一樣糟糕。然後可以以與正常填充預言完全相同的方式使用對消息中未填充的任何檢測。
對於不依賴於填充的現實生活中的純文字 Oracle,您可以查看Jager 和 Somorovsky 的論文“如何破壞 XML 加密”,第 4.5 章“基於軸的 Oracle”。
最後,您根本不想處理未經身份驗證的密文,尤其是在可能應用純文字預言機的線上會話中。對此的通用解決方案是使用經過身份驗證的密文,最好使用經過身份驗證的/AEAD 密碼。