将libsodium XChaCha20-Poly1305用于大文件

时间:2017-05-02 16:47:34

标签: c encryption encryption-symmetric

我正在浏览 libsodium ,尤其是对称加密选项XChaCha20-Poly1305。我无法理解的是, libsodium 似乎没有提供您在加密库中常见的“上下文/更新/最终化”工作方式。

libsodium 可以清楚地看出,XChaCha20-Poly1305消息的大小“没有实际限制”。但实际上,如果我正在加密多GB文件,我不清楚你将如何使用libsodium?因为很明显你只会将fread缓冲区的内容传递给crypto_aead_xchacha20poly1305_ietf_encrypt

那些认为这是关于主题的人的重要提示

在屈服于同伴的压力之后,我确实删除了这篇文章。然而,我已经应@MaartenBodewes的要求重新打开了它,他们强烈地感觉到它是关于主题的,并且如此强烈以至于他付出了一些努力来写答案。因此,出于对他的努力的尊重,我已经取消了这个帖子。请多给我一些“偏离主题”的评论,我已经阅读了足够多的评论!

1 个答案:

答案 0 :(得分:3)

在libsodium的介绍中,它的内容是:"其目标是提供构建更高级别加密工具所需的所有核心操作。"

因此,Libsodium是一个相对高级库,提供对底层结构的有限访问。

尽管如此,使用经过身份验证的密码加密此类大型文件存在一些固有的困难。问题是您需要首先验证真实性,然后开始解密,或者您需要在验证身份验证标记之前解密 online 。这反过来意味着如果验证失败,你必须编写/销毁内容。

一般情况下,您可以通过加密来解决这个问题。块大约16KiB左右,然后为块添加一个认证标签。当然,您需要确保增加nonce(确保流密码的计数器不会重复)。这当然会增加一些开销,但没什么了不起的 - 而且你还有一些开销。缺点是你不能再解密(因为这会留下空隙)。

如果您想制作一个非常先进的方案,您还可以在最后存储所有身份验证标记。或者缓冲内存中的所有身份验证标记,并计算所有收集的标记上的单个(HMAC)标记。

因此,多次调用=MAX(W"&N2&":W"&O2&")可视为一种选择。如果你这样做,你可能想要计算一个特定于文件的键,这样你就可以在零开始你的现时。

如果您只想保存存储的文件的机密性,可以考虑省略身份验证标记。在这种情况下,您可以使用int crypto_stream_xchacha20_xor_ic手动影响用于创建密钥流的计数器:

  

这允许直接访问任何块而无需计算以前的块。

显然,您仍然可以使用HMAC-SHA-2添加身份验证标记,这也可以在libsodium中使用,但这比使用poly1305要慢。

最后,libsodium是开源的。如果你非常勇敢,你可以进入血腥细节并构建自己的上下文/更新/最终确定。该算法当然支持它(提示:如果你走这条路线,从不在解密例程中缓冲认证标签或nonce - 直接解密)。