XChaCha20-Poly1305 的最大消息大小
libsodium 文件說 XChaCha20-Poly1305 可以加密任意大小的消息。
然而,唯一可用的規範(仍然是草案)解釋說,在底層使用了 IETF 版本的 ChaCha20-Poly1305(與 HChaCha20 組合用於密鑰派生),這意味著至少有 256GB 的硬限制,因為 32位計數器。
誰是對的,使用 XChaCha20-Poly1305 安全加密的消息最多可以有多大?
那麼經過身份驗證的數據呢?
你應該給 libsodium 維護者和網際網路草案作者發電子郵件,讓他們互相交談以弄清楚他們的意思,並清楚地記錄網際網路草案中的限制。(他們有時會在這裡發帖,但不經常發帖。)
原則上,XChaCha 提供 $ 2^{256} $ 單個鍵下的 512 位輸出塊,由 256 位輸入索引。唯一的問題是它們是如何劃分為消息與消息中的塊的。
對於XSalsa20 流密碼,消息號為 192 位,塊號為剩餘的 64 位,因此理論上每條消息的塊數限制為 $ 2^{64} $ , 或者 $ 2^{70} $ 字節。
對於eSTREAM和NaCl中的 Salsa20 流密碼,以及相關的 ChaCha 流密碼,消息編號為 64 位,塊編號為剩餘的 64 位,因此每條消息的塊數限制為 $ 2^{64} $ .
對於RFC 7539的 IETF ChaCha 流密碼,消息號為 96 位,塊號為 32 位,因此消息限制為 256 GB。
目前的 XChaCha-Poly1305 網際網路草案,draft-arciszewski-xchacha-03 ,根據RFC 7539的 IETF ChaCha-Poly1305 AEAD 定義為子常式,在§2, p. 3,但它遵循 XSalsa20 API,因此作為 API 的參數的消息號是 192 位,但由 API 內部管理的塊號是 32 位;內部 ChaCha 輸入的其餘 32 位固定為零。
crypto_aead_xchacha20poly1305_ietf
根據XChaCha20-Poly1305 建構頁面(存檔於 2019-05-30)和AEAD 限製表(存檔於 2018-11-07 ),在 libsodium 似乎實現的內容中,消息編號為 192 位,塊編號為 64位,例如 XSalsa20。
- 如果塊號的字節順序選擇得當,這應該與 draft-arciszewski-xchacha-03兼容,因為它可以正確實現網際網路草案之後的任何協議,但它也允許更大的消息,而不是網際網路草案允許。
- 也有可能是塊號編碼不匹配,因此 libsodium
crypto_aead_xchacha20poly1305_ietf
與 Draft-arciszewski-xchacha-03 不兼容——我沒有檢查過。話雖如此,32 位塊號和 64 位塊號之間的區別本質上是學術上的:任何實現願意接收的最大消息是對手在您面前的拒絕服務中浪費的最大記憶體量可以將消息放在地板上。很難想像這個數量應該合理地超過幾兆字節的應用程序,更不用說 256 GB - 更大的消息可以簡單地分成更小的部分,而額外的成本可以忽略不計,因為每部分的成本最多只有幾十個字節,即使您包含 192 位隨機數和一些格式化元數據。