我正在尝试使用.Net对称加密System.Security.Cryptography来加密许多小块文本,而不会增加太多的存储开销(处理时间并不重要,只是大小)。显而易见的方法是将它们全部堵塞并将结果加密为一个大块,但这在我的情况下是行不通的。
背景是我正在开发一个工具,有人可以使用它向我发送.docx word文档,以便我可以在不知道内容的情况下解决结构中的问题。我打算通过对称加密每个<w:t>
元素(可以是从单词的一部分到整个段落的任何内容)来做到这一点。
我希望能够移动和/或删除此类文本元素,并且当我将其还原时仍然能够解密文档,所以在我看来,我别无选择,只能单独加密每个元素,但如果你有几千个几个字节的块,那么使用AES,存储开销很大。
答案 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)