【发布时间】:2018-09-07 20:25:00
【问题描述】:
我有一些大文件想在通过网络发送或保存到磁盘之前进行 AES 加密。虽然encrypt streams 似乎可行,但似乎有warnings 与doing this 相对,人们建议将文件分成块并使用GCM 或crypto/nacl/secretbox。
由于真实性要求,处理数据流更加困难。我们不能先加密然后 MAC:本质上,我们通常不知道流的大小。流完成后我们不能发送 MAC,因为这通常由流被关闭来指示。我们不能即时解密流,因为我们必须查看整个密文才能检查 MAC。试图保护一个流给问题增加了巨大的复杂性,没有好的答案。解决方案是将流分成离散的块,并将它们视为消息。
文件被分割成 4KiB 块。每个块每次被修改时都会获得一个新的随机 128 位 IV。一个 128 位的身份验证标签 (GHASH) 保护每个块不被修改。
如果大量数据被解密,在验证标签被验证之前,并不总是可以缓冲所有解密的数据。将数据分成小块解决了延迟身份验证检查的问题,但引入了一个新问题。这些块可以重新排序... ...因为每个块都是单独加密的。因此,必须以某种方式将块的顺序编码到块本身中,以便能够检测重新排列任意数量的块。
有实际密码学经验的人能指出我正确的方向吗?
更新
我在问了这个问题后意识到,根本无法将整个字节流放入内存(加密 10GB 文件)和字节流 也是是未知长度之间存在差异可以持续很长时间,无需对流的开始进行解码(24 小时实时视频流)。
我最感兴趣的是在需要解码开始之前可以到达流末尾的大 blob。换句话说,加密不需要将整个明文/密文同时加载到内存中。
【问题讨论】:
-
在开始加密过程之前,您的文件大小是否已知?还是在加密窗口期间计算它们的大小?
-
两者。我在文件系统上有文件我知道 的大小,以及来自我不信任的客户端的流。但是,无论哪种方式,我都规定了最大字节大小。
标签: go encryption aes large-data