理论上,假设我使用可交换的对称密码来创建我自己的加密文件。我知道加密的rar / zip会做我正在考虑的事情,但我希望了解引擎盖下的细节。如果我只是在没有元数据的情况下对文件进行加密,那么我怎么知道我何时解密它才能正确解密呢?
我想到的一种方法是将密钥放在文件的前面,然后将密钥与文件一起加密。当我解密时,我可以将解密密钥与文件的开头进行比较并知道它是否有效,但我对将密钥放在文件中感到不舒服。
另一个想法是在文件的开头放置一个静态的数据部分,但是当尝试在发现密钥(或实际密钥)中的冲突时强制执行文件时,可以将其用作指示符任何人都知道数据的静态部分,我不喜欢透明的安全性。
我最后的想法是包含初始未加密文件的哈希值,但对于可能会降低进程速度的大文件。使用这种方法,我必须对文件进行散列和加密,这似乎效率低下。我希望有更好的技术。
验证使用可交换对称密码加密的文件是否已成功解密(无需与原始文件进行比较)的最佳方法是什么?
答案 0 :(得分:1)
使用具有良好定义但随机格式的标头。一种标准方法是使用随机数据和加密哈希值(伪代码如下):
byte[] header = new byte[64];
header[0..31] = RandomBytes(32); // 32 cryptographically random bytes
header[32..63] = SHA256(header[0..31]); //Hash of your random data
这给出了64字节的高熵数据。没有办法可以使用crib来强制加密。要验证您是否有正确的密钥,只需解密标头并检查以确保第二个32字节是第一个的有效SHA256哈希值。
答案 1 :(得分:1)
我仍然建议存储散列或校验和。如果将其放在加密数据的末尾,则可以在加密期间读取文件时生成校验和,因此不需要对文件进行任何额外的传递。 (校验和会有CPU开销,但这个数字很小。为此目的,你不需要使用像SHA这样昂贵的东西; CRC32也可以这样做。)
校验和有助于检测传输中的错误。如果加密数据中的单个位被更改,则经过该点的解密数据可能是垃圾。魔术标题不会检测到,但校验和将会。
答案 2 :(得分:0)
有一些密码模式,如CCM,可以提供完整性。我不确定它们如何符合你的交换要求。