c - 对大文件使用 libsodium XChaCha20-Poly1305

标签 c encryption encryption-symmetric

我正在查看 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/

相关文章:

java - 线程 "main"javax.crypto.BadPaddingException : Decryption error 中的异常

c# - 快速轻量级 .NET 客户端加密 -> 服务器解密

c - 如何将字符串与用户输入进行比较?

c - 如何使用内联汇编将给定地址写入寄存器

android - 在 webView 中显示不在文件系统中的图片

c++ - 我的 RC6 实现有什么问题?

sql-server - WHERE 子句中的 SQL 加密列

c++ - 使用C++加密和解密

c - 生产者和消费者代码不出现在屏幕上

c - 如何打印带有字母的板