Initialization-Vector

通過擦除 IV 而不是擦除密鑰來加密粉碎文件

  • November 26, 2018

想像一個經過驗證的加密文件系統,它使用 AES-256-CTR 加密 64 KB 文件扇區,然後使用 HMAC-SHA256 驗證 64 KB 文件扇區(包括 IV)。IV 是 128 位的,隨機生成的。

全域 256 位加密和 256 位身份驗證密鑰相互獨立,並在所有文件中使用(即沒有每個文件的密鑰)。

文件系統需要能夠加密分割單個文件,並且需要維持 100,000 IOPS。

在不為每個操作派生每個文件密鑰的情況下(或不在記憶體中記憶體數千個派生的每個文件密鑰),您將如何實現加密粉碎?

不是派生每個文件的密鑰,而是將儲存的公共部門 IV 與每個文件的秘密 SALT 進行異或就足夠了嗎?換句話說,隨機IV(儲存在磁碟上)將在加密或解密時與每個文件的秘密SALT進行異或。假設當需要對文件進行加密粉碎時,可以擦除每個文件的 SALT。

這應該避免需要每秒 100,000 次 HKDF 或 PRF 呼叫來派生每個文件的密鑰。

至關重要的是,由於系統是垃圾收集的,這也將避免在任何時間點將 100,000 個派生的每個文件密鑰分散在記憶體中,並避免與這些密鑰的記憶體和版本控制相關的錯誤。

加密粉碎通常通過擦除密鑰來操作,但擦除用於生成最終 IV 的 SALT 似乎更有意義。我不知道我是否在這裡遺漏了什麼?

不,僅擦除 AES-CTR IV 不足以可靠地使文件不可解密。

要了解原因,請考慮如果 AES 密鑰後來被洩露會發生什麼,並且攻擊者也恰好知道“粉碎”文件的明文內容的至少一個 AES 塊(即 16 個字節)。然後,他們可以將此已知明文與密文的相應部分進行異或運算,以獲得 AES-CTR 密鑰流的塊。

使用洩露的密鑰通過 AES 塊解密功能執行此塊,然後將顯示用於生成此密鑰流塊的輸入塊(即隨機數和計數器)。然後增加和/或減少計數器將使攻擊者解密文件的所有其他塊。

附言。在所有其他經典分組密碼操作模式(CBC、CFB、OFB、CTR)上也可能發生類似的攻擊。我將把弄清楚所需的確切步驟作為練習。(我連結到的維基百科頁面上的圖表應該會有所幫助。)使用 CBC 和 CFB 模式,文件的第一個塊在不知道 IV 的情況下無法解密,但另一方面,這些模式允許文件的所有其餘部分即使事先不知道任何明文,也可以解密。

現代AE 模式通常也不再能夠抵抗此類攻擊,特別是因為它們中的大多數只是簡單地將一種經典模式(通常是 CTR)與一些消息身份驗證方案結合起來,因此可以像底層的經典模式一樣成為攻擊者。

所有這一切的關鍵資訊是 IV 不是秘密,隱藏它不足以保護消息不被任何擁有密鑰的人解密。更一般地,現代加密方案的設計通常假設系統的唯一秘密參數是密鑰,並且只要攻擊者不知道他們的密鑰,就保持牢不可破的目標。硬幣的另一面是,如果攻擊者知道密鑰,這些方案通常不提供任何安全保證。

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