Encryption

除 AES 之外,哪種是用於大規模文件加密的最佳算法?

  • March 26, 2020

我一直在尋找一種快速、強大和健壯的算法來加密帶有身份驗證的大文件。我想在不使用第三方軟體的情況下自行實現該算法。我使用了不同的 AES 模式,但軟體實現容易受到側通道攻擊。除了最常用的 AES 256 GCM 具有身份驗證大小限制為 64 GB 的加密。我已經嘗試過其他著名的密碼,如 Xchacha20/XSalsa20 和 poly1305,但我無法繞過它們各自的大小限制(我只能使用 XChaCha20 - Poly1305 - IETF 版本加密高達 256 GB)!

  • 除了上述密碼之外,是否有足夠強大的密碼可以用於大規模加密和身份驗證?
  • 我應該對現有算法(如 Xchacha20 / XSalsa20 with Poly1305)應用哪些修改以實現無限制加密和身份驗證?

您不應該加密大文件,就好像它們只是一條消息一樣;您應該將它們分成小塊,並使用 AEAD 分別加密每個塊,使用以下結構:

  • 防止塊的修改、重新排序、插入和刪除;
  • 防止文件被截斷;
  • 一旦單個鍵處理了太多數據,就輪換鍵。

一個原因是加密庫通常是這樣實現的,因此您需要記憶體中的整個消息來對其進行加密。另一個原因是工具的使用者通常期望輸出將逐漸生成(因此他們可以將其通過管道傳輸到其他工具),但典型的 AEAD 密碼要求您永遠不會輸出偽造密文的解密,因此將整個文件加密為一個消息要求您在產生任何輸出之前對整個事物進行身份驗證。(並不是說輸出偽造的真實前綴總是安全的。)

看:

一旦你採用了這個範例,你關心的密碼中的消息長度和密文大小限制就不再重要了,因為你只加密短消息,如果你超過密文限制,你可以建立密鑰輪換對於一個鍵。例如,我在上面連結到的 Libsodium secretstream API 提供了這個功能:

  • 棘輪:在流中的任何點,都可能“忘記”用於加密先前消息的密鑰,並切換到新密鑰。

因此,如果您只計算已處理的數據量並指示庫在接近限制時重新設置密鑰,那麼正如文件所述,“對流的總長度沒有實際限制”。

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