使用 AES-GCM 加密超過 ~64GiB - 完整性
我正在尋找使用 AES-GCM 在同一密鑰下加密超過可接受限制 ~64GiB 的解決方案。我知道我有義務為接下來的每個 ~64GiB 塊交換隨機數,但有一件事困擾著我。我還需要保持 ~64GiB 塊順序的完整性,以禁用塊交換。我正在考慮將以前的身份驗證標記作為 AAD 添加到下一個塊。夠了嗎?我無論如何都找不到這個問題的答案。
感謝幫助
隨機數包含在標籤的計算中。
如果在每條消息之後增加隨機數,則不能重新排序或複制塊。如果預計第三條消息已使用 nonce 加密
3
,則如果提供了使用 nonce 加密的消息,則標籤驗證將不會通過2
。但是,您需要檢測的一件事是收到最後一條消息的時間。可以通過保留一些 nonce 來表示這一點來實現,就像在 STREAM 構造中一樣。
如果 nonce 實際上是一個塊索引,則密鑰只能使用一次,因為您不希望一
(key, nonce)
對重複,尤其是對於不同的消息。因此,您要麼需要使用唯一鍵,要麼將 nonce 的一部分保留為 IV(或 message-not chunk-index),並將其餘部分保留為塊索引。
單個塊應該有一個合理的大小,如果只是因為你不想下載、儲存和驗證 64 GB 以最終丟棄所有由於沒有驗證的標籤。16 KB 和 64 KB 是常見的大小。
而且,尤其是使用 AES-GCM,您可能還希望經常進行密鑰輪換。
如果這是一個選項,只需使用可以處理所有這些事情的 TLS。
如果您不想使用 TLS,但 AES-GCM 不是強制性的,那麼像 xchacha20-poly1305 這樣的結構更容易安全地用於處理大型消息。
如果您不想使用 TLS,而想使用 AES-GCM,請使用STREAM構造。
如果您不想使用 TLS,AES-GCM 不是必需的,並且您不想編寫程式碼,請使用 libsodium 的 secretstream構造。
有關此主題的更多實用細節,請參閱加密一組相關消息。