Encryption 如何在golang中使用AES256-GCM加密文件?

Encryption 如何在golang中使用AES256-GCM加密文件?,encryption,go,block-cipher,Encryption,Go,Block Cipher,AES256-GCM可在go as中实施 但是,Seal接口方法cipher.AEAD有签名: Seal(dst, nonce, plaintext, additionalData []byte) []byte 因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的 一种可能的方法是在Seal和Open上实现Reader/Writer接口,但这不应该通过AEAD的分组密码“模式”来解决吗?所以我想知道这是golang密码库的设计错误,还是我错过了GCM的一些重要功能?这不是设计错误

AES256-GCM可在go as中实施

但是,
Seal
接口方法
cipher.AEAD
有签名:

Seal(dst, nonce, plaintext, additionalData []byte) []byte
因此,对于非常大的文件,必须将所有文件内容读入内存,这是不可接受的


一种可能的方法是在
Seal
Open
上实现
Reader
/
Writer
接口,但这不应该通过AEAD的分组密码“模式”来解决吗?所以我想知道这是golang密码库的设计错误,还是我错过了GCM的一些重要功能?

这不是设计错误。只是API在这方面是不完整的

GCM是一种流式操作模式,因此能够在不停止流的情况下按需处理加密和解密。您似乎无法将相同的AEAD实例与以前的MAC状态一起重用,因此无法直接将此API用于GCM加密


您可以在
crypto.NewCTR
和您自己的GHASH实现之上实现您自己的GCM。

AEADs不应用于一次性加密大量数据。API旨在阻止这种情况

在一次操作中加密大量数据意味着a)所有数据必须保存在内存中,或者b)API必须通过返回未经验证的明文以流方式运行

返回未经验证的数据是危险的,在互联网上发现有人建议使用
gpg-d your_archive.tgz.gpg | tar xz
,因为gpg命令还提供流媒体接口

当然,使用AES-GCM这样的结构很容易 如果应用程序不支持,可以随意操作纯文本 在处理之前对其进行身份验证。即使应用程序很小心 在验证真实性之前,不要将明文“发布”到UI 一个流媒体设计暴露了更多的程序攻击面

通过规范大型密文,从而流式API,下一步 出现的协议更有可能在没有意识到的情况下使用它们 这些问题,因此问题依然存在

最好将明文输入分块成相当大的数据块 部分(比如16KiB)并单独加密。这些块只需要 足够大,因此额外验证器的开销是 可以忽略不计的有了这样的设计,可以以增量的方式处理大型消息 无需处理未经验证的明文即可处理,以及 AEAD API可以更安全。(更不用说更大的消息可以 自AES-GCM以来处理,例如,单个 纯文本。)

需要考虑一些问题,以确保数据块处于正确的位置 顺序,即通过计算nonce,第一个块应该是第一个,即从零开始,最后一个块应该是第一个 最后,即通过在空的终止符块上附加特殊的 其他数据。但这并不难

例如,请参见中使用的分块

即使有这样的设计,攻击者仍然会造成 要检测到截断的消息。如果你想要更高的目标,一个 可以使用all或nothing转换,尽管这需要两个
传递输入,但并不总是可行的。

谢谢!作为建议,我认为这个解释可以添加到golang文档中。miniLock的链接给出了“404-未找到页面”。