Encryption 随机存取加密文件

Encryption 随机存取加密文件,encryption,download,random-access,ecb,cbc-mode,Encryption,Download,Random Access,Ecb,Cbc Mode,我正在实现一个基于web的文件存储服务(C#)。文件存储在服务器上时将被加密,但难题是如何实现解密功能 这些文件可以是任何大小,从几KB到几GB。数据传输是分块进行的,因此用户可以从偏移量50000、75000等处下载数据。这对未加密的文件很有效,但如果使用加密,则必须在从偏移量读取每个块之前解密整个文件 所以,我正在研究如何解决这个问题。到目前为止,我的研究表明ECB和CBC是可以使用的。ECB是最基本的(也是最不安全的),每个数据块都单独加密。欧洲央行的运作方式正是我所期待的,但安全是一个问

我正在实现一个基于web的文件存储服务(C#)。文件存储在服务器上时将被加密,但难题是如何实现解密功能

这些文件可以是任何大小,从几KB到几GB。数据传输是分块进行的,因此用户可以从偏移量50000、75000等处下载数据。这对未加密的文件很有效,但如果使用加密,则必须在从偏移量读取每个块之前解密整个文件


所以,我正在研究如何解决这个问题。到目前为止,我的研究表明ECB和CBC是可以使用的。ECB是最基本的(也是最不安全的),每个数据块都单独加密。欧洲央行的运作方式正是我所期待的,但安全是一个问题。CBC与此类似,但在解密当前块之前,需要先解密上一个块。只要文件从头到尾被读取,并且在服务器上解密时保留数据,这是可以的,但最终这并不比在传输之前解密整个文件服务器端好多少

有谁知道我应该考虑的其他选择吗?我现在还没有代码,因为我还在做理论研究。

不要使用ECB(电子密码本)。明文中的任何模式都将在密文中显示为模式。CBC(密码块链接)具有随机读取权限(调用代码知道密钥,IV是前一个块的结果),但写入块需要重写所有后续块

更好的模式是。实际上,每个块使用相同的键,每个块的IV是该块从定义的起始点到初始IV的偏移量之和。例如,块n的IV是IV+n。中第15页详细描述了CTR模式。有关键和IV派生的指导,请参见


还有其他一些类似的模式,例如。

您是否只需要随机读访问和顺序写访问(即文件一次性写入)?您是否需要完整性检查?我强烈建议使用Mac电脑。在没有身份验证的情况下,你可以做很多奇怪的事情。“CBC是类似的,但是在解密当前块之前你需要先解密上一个块。”错。拥有上一个块的密文就足够了。你不需要明文。查看维基百科上的CBC。他们有一些漂亮的图表。@CodesInChaos:是的,只有随机读取访问。整个文件只有在完全上传时才加密,因此一次写入即可。我没有意识到,仅仅使用CBC中上一块的密码文本就足够了——每天都要学点东西!:)我可能会将文件分成几千字节的块,并使用隐式IV使用GCM对每个块进行加密。@akton:是的,我知道ECB的弱点,一定会查看您的其他建议,然后再与您联系@CodesInChaos:根据你所写的我收集到的信息,你建议我手动将文件分为若干块,并用隐式IV对每个块进行加密。这是可行的,但速度非常慢。我还相信我可以使用任何“固定大小”的加密算法来实现这一点。我希望GCM分组密码加密允许我一次性加密整个文件,通过知道每个加密块的大小,然后能够计算偏移量、读取块并分别解密。到目前为止,我还没有找到这种方法的任何代码示例。分块加密应该不会太慢。问题在于你的代码,而不是方法。@CodesInChaos:我运行了一些测试,并意识到我的方法并不慢,只是比我预期的慢得多,所以你是完全正确的。但是,是否真的有必要将源数据分块并手动加密?该算法不应该以X字节的块加密数据吗?只要我知道这些块有多大,我就应该能够找到偏移量,读取X字节(加密的块大小)并解密?