随机访问加密文件

3

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

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

因此,我正在研究如何解决这个问题。我的研究表明,可以使用ECB和CBC。ECB是最基本的(也是最不安全的),每个块都单独加密。ECB的工作方式非常符合我的要求,但安全性成为了问题。CBC类似,但需要在解密当前块之前解密前一个块。只要从头到尾读取文件并在服务器上解密数据,这还可以,但归根结底,与在服务器端传输前解密整个文件没有太大区别。

是否有其他我应该考虑的选择?目前我还没有编写代码,因为我仍然只是进行理论研究。


你是否只需要随机读取访问和顺序写入访问(即文件一次性写入)? - CodesInChaos
你需要完整性检查吗?我强烈建议使用MAC。如果没有身份验证,可能会发生很多奇怪的事情。 - CodesInChaos
CBC是类似的,但在解密当前块之前需要先解密前一个块。这是错误的。只有前一个块的密文就足够了,不需要明文。请查看维基百科上的CBC,它们有一些漂亮的图表。 - CodesInChaos
@CodesInChaos:是的,只有随机读取访问。整个文件仅在完全上传时加密,因此一次性写入。我不知道在CBC中仅使用前一个块的密文就足够了-每天都会学到新东西! :) - Andreas
1个回答

2
请勿使用ECB(电子密码本)模式。明文中的任何模式都会出现在密文中。CBC(密码块链接)具有随机读取权限(调用代码知道密钥,IV是前一个块的结果),但编写一个块需要重新编写所有后续块。
更好的模式是计数器(CTR)。实际上,每个块都使用相同的密钥,每个块的IV是该块与定义的起始点之间的偏移量之和和一个初始IV。例如,块n的IV为IV + n。CTR模式在NIST SP800-38a的第15页详细描述。关于密钥和IV派生的指导可以在NIST SP800-108中找到。
还有一些类似的模式,如(Galois Counter Mode) GCM

我可能会将文件分成几个几千字节的块,并使用GCM加密每个块,使用隐式IV。 - CodesInChaos
@akton:是的,我知道 ECB 的弱点,并且一定会查看您的其他建议并回复您! - Andreas
@CodesInChaos:根据您所写的内容,我得出您建议我手动将文件分成块,并使用隐式IV加密每个块。这种方法可行,但速度非常慢。我还相信我可以使用任何“固定大小”的加密算法来实现这一点。我期望GCM分组密码加密能够让我一次性加密整个文件,并通过知道每个加密块的大小来计算偏移量,读取一个块并逐个解密。到目前为止,我还没有找到任何此方法的代码示例。 - Andreas
分块加密不应该很慢。问题出在你的代码上,而不是方法本身。 - CodesInChaos
问题在于这种情况下,GCM只会在文件末尾添加一个MAC。因此,您需要读取整个文件才能验证一小部分内容。 - CodesInChaos
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接