对大文件使用LibXchacha20-Poly1305

对大文件使用LibXchacha20-Poly1305,c,encryption,encryption-symmetric,C,Encryption,Encryption Symmetric,我在浏览libnail,尤其是对称加密选项。我无法理解的是,libnaid似乎没有提供加密库中常见的“上下文/更新/最终确定”工作方式 从LibNadium可以清楚地看出,XCHACHAA20-Poly1305消息的大小“没有实际限制”。然而,在实际应用中,如果我加密一个多GB的文件,我不太清楚您将如何使用libnaude来实现这一点?因为很明显,您只会将fread缓冲区的内容传递给crypto\u aead\u xchacha20poly1305\u ietf\u encrypt 对那些认为这

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

从LibNadium可以清楚地看出,XCHACHAA20-Poly1305消息的大小“没有实际限制”。然而,在实际应用中,如果我加密一个多GB的文件,我不太清楚您将如何使用libnaude来实现这一点?因为很明显,您只会将
fread
缓冲区的内容传递给
crypto\u aead\u xchacha20poly1305\u ietf\u encrypt

对那些认为这是离题的人的重要提示


在屈服于同行的压力后,我确实删除了这篇文章。然而,应@MaartenBodewes的请求,我重新打开了它,他强烈地感觉到它是关于这个主题的,并且如此强烈地感觉到他投入了一些精力来写一个答案。因此,出于对他的努力的尊重,我取消了这个职位。请不要给我太多“离题”的评论,我已经读够了

在libnaid的介绍中,它写道:“它的目标是提供构建更高级加密工具所需的所有核心操作。”

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


也就是说,使用经过身份验证的密码对如此大的文件进行加密存在一些固有的困难。问题在于,您要么需要首先验证真实性,然后开始解密,要么需要在验证身份验证标签之前在线解密。这反过来意味着,如果验证失败,您必须写入/销毁内容

通常,您可以通过加密16KiB左右的数据块,然后为该数据块添加身份验证标签来解决此问题。当然,您需要确保增加nonce(确保流密码的计数器不会重复)。这当然会增加一些开销,但没有什么了不起的——而且你也会有一些开销。缺点是你不能再原地解密(因为那样会留下漏洞)

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

因此多次调用
crypto\u aead\u xchacha20poly1305\u ietf\u encrypt
可能是一种选择。如果这样做,您可能需要计算文件特定的密钥,以便可以在零开始nonce


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

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

显然,您仍然可以使用HMAC-SHA-2添加一个身份验证标签,该标签在LibNasdaq中也可用,但这比使用poly1305要慢得多



最后,libnaid是开源的。如果你非常勇敢,你可以深入血淋淋的细节,构建自己的上下文/更新/最终确定。该算法当然支持它(提示:如果你走这条路,在解密过程中永远不要缓冲身份验证标记或nonce-直接解密)。

@MaartenBodewes对我来说这似乎没有离题,但可能最好在Security.SE上问它(对接近的投票者来说:“它更适合其他地方”不是关闭的理由。)有趣的是,我开始在Security.SE上作曲。然后我坐在那里思考了10分钟。然后我决定,Security.SE上的智者可能会抱怨它与“编程”相关,并将我指给我看。我想我永远也不会让每个人都满意-(好的,这是关于实现一个算法(这在这里是离题的;堆栈溢出不是关于帮助您编写代码)还是关于使用一个库(在这种情况下,提供一个和一个明确的问题陈述,如中所述),或关于算法中的潜在缺陷?我认为如果它是最后一个,那么它在Security.SE上会更好,但您需要阅读以确保。@MaartenBodewes都是您的。我期待您的回答。;-@MaartenBodewes请重新阅读我写的内容——我不是说询问如何使用库是离题的。我是说,它应该附带一个MCVE,以显示库必须适应的结构,以及一个解释您想要做什么的MCVE。现在回想起来,MCVE是一个错误的术语,但是这个想法——一个简短的代表性代码示例——正是我想要表达的。谢谢。我很感激。