【问题标题】:Random access encrypted file随机访问加密文件
【发布时间】:2014-09-02 00:52:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你只需要随机读访问和顺序写访问(即文件一次写入)吗?
  • 您需要完整性检查吗?我强烈推荐使用 MAC。如果没有身份验证,您可以做很多奇怪的事情。
  • "CBC 类似,但在解密当前块之前需要先解密前一个块。"错误的。拥有前一个块的密文就足够了。你不需要明文。在维基百科上查看 CBC。他们有一些很好的图表。
  • @CodesInChaos:是的,只有随机读取访问。整个文件只有在完全上传时才会加密,因此是一次性写入的。我不知道仅使用 CBC 中前一个块的密文就足够了 - 每天都学习一些东西! :)

标签: encryption download random-access ecb cbc-mode


【解决方案1】:

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

更好的模式是Counter (CTR)。实际上,每个块使用相同的密钥,并且每个块的 IV 是该块从定义的开始的偏移量和初始 IV 的总和。例如,块 n 的 IV 是 IV + n。 CTR 模式在第 15 页NIST SP800-38a 中有详细描述。有关密钥和 IV 推导的指南可以在 NIST SP800-108 中找到。

还有一些其他类似的模式,例如(Galois Counter Mode) GCM

【讨论】:

  • 我可能会将文件分成几千字节的块,并使用 GCM 加密每个块,使用隐式 IV。
  • @akton:是的,我知道欧洲央行的弱点,一定会查看您的其他建议并回复您!
  • @CodesInChaos:从你写的我收集到的你建议我手动将文件分成块并用隐式 IV 加密每个块。这行得通,但是非常缓慢。我也相信我可以使用任何“固定大小”的加密算法来实现这一点。我希望 GCM 块密码加密允许我一次性加密整个文件,并且通过知道每个加密块的大小,然后能够计算偏移量、读取一个块并单独解密。到目前为止,我还没有找到这种方法的任何代码示例。
  • 分块加密不应该很慢。问题在于您的代码,而不是方法。
  • @CodesInChaos:我进行了一些测试并意识到我的方法并不慢 - 它只是一个比我预期的慢得多的过程,所以你是完全正确的。但是,真的有必要将源数据分成块并手动加密吗?算法不应该加密 X 字节块中的数据吗,只要我知道这些块有多大,我应该能够去偏移,读取 X 字节(加密的块大小)并解密?跨度>
猜你喜欢
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2010-09-17
  • 1970-01-01
相关资源
最近更新 更多