【发布时间】:2015-01-22 11:19:21
【问题描述】:
我有 been trying 到 figure out 完成将大(几 GB)文件加密到文件系统以供以后访问的任务的最佳方法。
我一直在试验几种 AES 模式(尤其是 CBC 和 GCM),我发现每种方法都有一些优点和缺点。
经过研究和询问,我得出的结论是,至少目前,使用 AES+GCM 对我来说是不可行的,主要是因为 issues 它 has in Java 以及我 不能使用 BouncyCastle。
所以我写这篇文章是为了讨论我将要实施以完成任务的协议。请提供您认为合适的反馈。
加密
- 使用 AES/CBC/PKCS5Padding 和 256 位密钥
- 文件将使用自定义 CipherOutputStream 进行加密。此输出流将负责在文件开头写入自定义标头,该标头至少包含以下内容:
- 前几个字节可以轻松判断文件已加密
- 四
- 使用的算法、模式和填充
- 密钥的大小
- 标头本身的长度
- 在文件被加密的同时,它也会被消化以计算其身份验证标签。
- 当加密结束时,标签将附加在文件的末尾。该标签的大小是已知的,因此以后可以很容易地恢复它。
解密
- 将使用自定义 CipherInputStream。此流知道如何读取标头。
- 然后它将读取身份验证标签,并消化整个文件(不加密)以验证它没有被篡改(我还没有实际测量它的执行情况,但这是我能想到的唯一方法安全地开始解密,而不会有知道文件一开始就不应该被解密的风险)。
- 如果标签验证成功,那么标头将提供初始化密码和使输入流解密文件所需的所有信息。否则会失败。
这对您来说似乎可以处理大文件的加密/解密吗?
【问题讨论】:
-
好的,抱歉,忘记之前的评论了。直到现在才阅读链接。问题 1:SHA-hash 是在加密层内(即明文的 SHA,然后加密哈希)还是在外面?应该在里面。问题2:为什么是CBC? (不是“为什么不是 GCM”,而是为什么要对所有其他可能的事情进行 CBC?)
-
问题1:根据我的阅读,序列应该是加密然后mac,所以这就是我打算做的。 问题 2: 嗯,CBC 是我第一次尝试,而且我已经完成了整个加密,所以我想到了使用它。它有什么问题,您认为什么是更好的选择?
-
有点长,在下面补充。
标签: security encryption cryptography aes