我有一些大文件,我想在通过网络发送或保存到磁盘之前进行AES加密.虽然看起来可能是encrypt streams,但似乎是warnings对doing this,相反,人们建议将文件分成块,并使用GCM或crypto/nacl/secubox.
由于真实性要求,处理数据流更加困难.我们不能加密然后MAC:从本质上讲,我们通常不知道流的大小.我们不能在流完成后发送MAC,因为这通常由流被关闭来指示.我们不能解密飞翔上的流,因为我们必须看到整个密文才能判断媒体访问控制.试图保护流会给问题增加极大的复杂性,而且没有好的答案.解决方案是将流拆分成离散的块,并将其视为消息.
文件被分割成4KB的块.每次修改时,每个块都会获得一个新的随机128位IV.128位身份验证标签(GHASH)保护每个块不受修改.
如果大量数据被解密,则直到验证标签被验证之前,并不总是可能缓冲所有解密的数据.将数据拆分成小块修复了延迟身份验证判断的问题,但引入了一个新的问题.这些大块可以重新排序....因 for each 区块都是单独加密的.因此,必须以某种方式将块的顺序编码到块本身中,以便能够检测到重新排列任意数量的块.
有实际密码学经验的人能给我指个正确的方向吗?
Update
在问了这个问题后,我意识到,无法将整个字节流放入内存(加密10GB文件)和字节流also是未知长度之间存在差异,字节流also可能会持续很久,而不再需要对其进行解码(24小时直播视频流).
我最感兴趣的是大的BLOB,在开始需要解码之前可以到达流的末尾.换句话说,encryption that does not require the whole plaintext/ciphertext to be loaded into memory at the same time.