对称加密加密许多小块

时间:2013-01-28 11:34:41

标签: c# .net encryption cryptography encryption-symmetric

我正在尝试使用.Net对称加密System.Security.Cryptography来加密许多小块文本,而不会增加太多的存储开销(处理时间并不重要,只是大小)。显而易见的方法是将它们全部堵塞并将结果加密为一个大块,但这在我的情况下是行不通的。

背景是我正在开发一个工具,有人可以使用它向我发送.docx word文档,以便我可以在不知道内容的情况下解决结构中的问题。我打算通过对称加密每个<w:t>元素(可以是从单词的一部分到整个段落的任何内容)来做到这一点。

我希望能够移动和/或删除此类文本元素,并且当我将其还原时仍然能够解密文档,所以在我看来,我别无选择,只能单独加密每个元素,但如果你有几千个几个字节的块,那么使用AES,存储开销很大。

4 个答案:

答案 0 :(得分:4)

对于您不想阅读的任何信息,最好的加密方式是首先不存在的信息。

如果您只关心文档的结构,为什么不完全放弃转移并将其替换为占位符?

  • 在客户端创建一个数据存储,其中包含与占位符关联的所有已删除内容(例如:{1},{2},{3} ...等)

  • 向自己发送结构和占位符(即<w:t>{1}</w:t>

  • 修复结构。

  • 将固定结构返回到客户端,并在客户端通过将原位内容替换为原始内容将文档放回原位。

通过这种方式,您不会传输任何明智的信息(它仍然存在于客户端,除了文档本身的结构外,任何信息都不会受到损害)。此外,由于大多数内容都不会出现,因此您需要调整较小的文件大小。

更好的是,您可以让客户端在将文件发送给您之前查看该文件,以便他可以验证所有合理的信息实际上已被删除。

答案 1 :(得分:1)

这里没有简单的解决方案,基本上你要求我们设计你的整个应用程序。您可以使用CTR模式加密,这是块密码的流模式。使用流模式,您只需要与纯文本字节一样多的加密字节。

那就是说,使用流模式你仍然需要存储某种nonce。必须存在此随机数以保护密文。然而,有时可以从上下文计算随机数;例如文件名上的哈希应该可以解决问题。但是,对于文档中的元素,这可能更难。

请注意,您必须发明一种方案,将数据转换为字节并返回(确定字母表,并对字母表进行编码)。如果这种方案效率不高,最终可能会产生巨大的开销。

答案 2 :(得分:0)

块大小为128位的AES导致平均每个加密片段8字节的开销 - 在我看来并不坏。您可以连接所有片段,将它们加密为一个大块,最后将其拆分并再次放置所有片段。这将一直有效,直到你开始四处移动并删除碎片,除非你想出一些对策。

例如,您可以使用连接块中的位置为每个加密片段添加前缀,并使用RC4之类的流密码而不是AES - 这允许您将加密的片段恢复为原始顺序,从而使用任意填充填充已删除元素的间隙值并正确解密。

这可能会降低开销,但您可能仍需要四个字节。您可能还需要将密文编码为十六进制或Base64字符串,因为您不希望XML中存在原始二进制数据。但是这种编码会比使用AES的一些填充产生更大的开销,因此您也可以选择最简单的解决方案。

最后的想法 - 当您使用像AES这样的分组密码时,在使用相同的密钥加密多个分片时必须要小心,因为相同的明文可能会产生相同的密文。有关详细信息,请参阅block cipher modes of operation

答案 3 :(得分:0)

要以最小的开销加密某些东西,我建议使用流密码,例如Rabbit,或者块密码,例如点亮模式下的AES。两者都避免了填充的要求。您需要仔细考虑加密密钥的内容。有一些方法可以从单个秘密主密钥和一些不太安全的辅助数据中导出许多子密钥。查找密钥派生函数(KDF)。例如PBKDF2HKDF