這種確定性地使用 CBC 的方法是否安全?
我正在嘗試設計一種確定性加密方案,以使在不受信任的數據庫中搜尋能夠以最小的密文 IV 成本進行搜尋。我知道這是非常糟糕的做法,但不幸的是這是業務需求,所以我只是想在這種情況下提供最好的安全性。
現在我正在考慮一種確定性地使用 AES-CBC 的方法。我的想法基於Bellare、Boldyreva 和 O’Neill在Deterministic and Efficiently Searchable Encryption中提出的方案。
給定一個明文 $ x $ 我們需要確定性地加密,我們首先計算 $ MAC_{k_1}(x) $ 在哪裡 $ k_1 $ 是僅在此步驟中使用的密鑰。接下來,我們取計算出的 MAC 的底部四個字節,稱它們為 $ y $ , 併計算 $ H(y) $ 在哪裡 $ H $ 是一個公共散列函式(例如 SHA-256)。截斷這個計算的散列並將其用作 CBC 模式的 IV。密文是 $ y||CBC_{k_2, H(y)}(x) $ . ( $ k_2 $ 是我們的加密密鑰)
這可能看起來令人費解(確實如此),但我正在嘗試想辦法在將可預測的 IV 與 CBC 一起使用時繞過等式洩漏。使用固定IV,具有相同首塊的不同明文將加密為具有相同首塊的密文。使用上述方案,兩個不同明文的第一個塊相等的唯一方法是它們計算的 MAC 值具有相同的四個低位字節,我們預計這僅在之後發生 $ 2^{16} $ 加密。
我們當然可以通過使用超過四個字節的 MAC 來降低衝突的可能性,但是對於長度受限的環境,四個字節可能是不安全的。
我對這種結構很謹慎,因為它看起來很笨拙——如果有明顯的缺陷,請毫不猶豫地指出。
謝謝大家的幫助。
您的構造似乎與SIV mode非常相似,除了您使用 CBC 而不是 CTR 模式進行加密步驟並且您將 MAC 值截斷為僅 32 位(並通過散列重新擴展它以導出實際的 IV )。
我在你的方案中看到的唯一明顯的弱點是 $ y $ 以及隨之而來的小 IV 空間。我更喜歡128位 $ y $ ,但即使只有 64 位或 48 位,至少也比 32 位有相當大的改進。使用 32 位 $ y $ , 不僅在大約 $ 2^{16} $ 加密,但大約 $ 2^{32} $ 加密預言機查詢攻擊者甚至可以安排使用任何可能的 IV 對選定的消息前綴進行加密,這將允許他們執行逐塊字典攻擊。根據您的實現設置,許多 oracle 查詢可能可行,也可能不可行,但它有點太接近實際攻擊了,讓我感到不舒服。
(還要注意,這種攻擊可以很容易地同時針對多個目標消息進行,即使有任何額外的努力也很少。事實上,如果攻擊者只需要從多個消息中解碼一個消息,擁有多個目標會加快速度。)
除此之外,你的結構在我看來還不錯。請注意,您不一定需要在 IV 擴展步驟中使用散列函式:只需填充 $ y $ 到一個完整的密碼塊並應用塊密碼加密功能就可以了。NIST SP 800-38A在附錄 C中甚至明確認可了這種從 nonce 導出 CBC IV 的方法。