我正在查看 libsodium,特别是对称加密选项 XChaCha20-Poly1305
.我无法理解的是,libsodium 似乎没有提供加密库中常见的“上下文/更新/最终确定”工作方式。
从 libsodium 中可以清楚地看出,XChaCha20-Poly1305 消息的大小“没有实际限制”。但是实际上,如果我要加密一个多 GB 的文件,我不太清楚您将如何使用 libsodium ?因为显然你只会传递 fread
的内容缓冲到 crypto_aead_xchacha20poly1305_ietf_encrypt
?
给那些认为这不是主题的人的重要提示
在屈服于同辈压力之后,我确实删除了这篇文章。但是,我应@MaartenBodewes 的要求重新打开了它,他强烈认为这是切入主题,并且非常强烈以至于他付出了一些努力来撰写答案。因此,出于对他努力的尊重,我取消了该帖子。请给我更多的“离题”评论,我已经阅读了足够多的评论!
最佳答案
在 libsodium 的介绍中,它写道:“它的目标是提供构建更高级别的加密工具所需的所有核心操作。”
因此,Libsodium 是一个相对高级的库,它提供对底层结构的有限访问。
也就是说,使用经过身份验证的密码加密此类大文件存在一些固有的困难。问题是要么需要先验证真伪再开始解密,要么需要先在线解密,然后再验证认证标签。这反过来意味着如果验证失败,您必须写入/销毁内容。
通常你可以通过加密来解决这个问题,例如16KiB 左右的块,然后为该块添加身份验证标签。当然,您需要确保增加随机数(确保流密码的计数器不重复)。这当然会增加一些开销,但没什么了不起的 - 无论如何你都会有一些开销。缺点是您不能再就地解密(因为这会留下间隙)。
如果您想制作一个非常高级的方案,您还可以在最后存储所有身份验证标签。或者将所有身份验证标签缓存在内存中,并在所有收集的标签上计算单个 (HMAC) 标签。
所以打电话crypto_aead_xchacha20poly1305_ietf_encrypt
多次可被视为一种选择。如果你这样做,你可能想要计算一个文件特定的键,这样你就可以从零开始你的随机数。
如果您只想对存储的文件保密,您可以考虑省略身份验证标签。在这种情况下,您可以使用 int crypto_stream_xchacha20_xor_ic
手动影响用于创建 key 流的计数器。 :
This permits direct access to any block without having to compute the previous ones.
显然,您仍然可以使用 HMAC-SHA-2 添加身份验证标签,该标签也在 libsodium 中可用,但这会比使用 poly1305 慢。
最后,libsodium 是开源的。如果你非常勇敢,你可以进入血腥细节并构建你自己的上下文/更新/完成。该算法当然支持它(提示:如果您走这条路线,请不要在解密例程期间缓冲身份验证标签或随机数 - 直接解密)。
关于c - 对大文件使用 libsodium XChaCha20-Poly1305,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43743250/