Cryptography 识别正确解密的交换密码?

Cryptography 识别正确解密的交换密码?,cryptography,Cryptography,理论上,假设我使用一个交换对称密码来创建我自己的加密文件。我知道一个加密的rar/zip可以满足我的想法,但我希望了解幕后的细节。如果我只是在没有元数据的情况下加密文件,那么当我解密它时,我怎么知道它被正确地解密了呢 我想到的一种方法是将使用的密钥放在文件前面,然后将密钥与文件一起加密。当我解密时,我可以将解密密钥与文件的开头进行比较,并知道它是否有效,但我对实际将密钥放在文件中感到不舒服 另一个想法是在文件的开头放置一个静态数据部分,但如果有人知道静态数据部分,并且我不喜欢模糊性带来的安全性,

理论上,假设我使用一个交换对称密码来创建我自己的加密文件。我知道一个加密的rar/zip可以满足我的想法,但我希望了解幕后的细节。如果我只是在没有元数据的情况下加密文件,那么当我解密它时,我怎么知道它被正确地解密了呢

我想到的一种方法是将使用的密钥放在文件前面,然后将密钥与文件一起加密。当我解密时,我可以将解密密钥与文件的开头进行比较,并知道它是否有效,但我对实际将密钥放在文件中感到不舒服

另一个想法是在文件的开头放置一个静态数据部分,但如果有人知道静态数据部分,并且我不喜欢模糊性带来的安全性,那么当试图强制文件到发现密钥(或实际密钥)冲突时,这可以用作指示

我的最后一个想法是包含初始未加密文件的散列,但对于大文件,这可能会减慢进程。使用这种方法,我必须对文件进行散列和加密,这似乎效率低下。我希望有更好的技术


验证使用交换对称密码加密的文件是否成功解密的最佳方法是什么(无需与原始文件进行比较)?

有提供完整性的密码模式。我不确定它们如何符合您对交换性的要求。

使用具有定义良好但随机格式的标题。一种标准方法是使用随机数据和加密哈希(伪代码如下):


这将提供64字节的高熵数据。这不可能被用于强制加密。要验证您是否拥有正确的密钥,只需解密标头并检查以确保第二个32字节是第一个字节的有效SHA256哈希。

我仍然建议存储哈希或校验和。如果将其放在加密数据的末尾,则可以在加密期间读取文件时生成校验和,因此不需要对文件进行任何额外的传递。(校验和将有CPU开销,但这将是最小的。您不需要为此使用像SHA这样昂贵的东西;CRC32就可以了。)


校验和将有助于检测传输中的错误。如果加密数据中的一个位被改变,经过该点的解密数据可能是垃圾。魔法头不会检测到,但校验和会检测到。

如果有两个可交换密码A和B,其中A(…)和B(…)加密,A'(…)和B'(…)解密,则A'(B(A(数据))等同于B(数据)。基本上是任何与3-pass协议一起工作的密码。在这里读第四段:我同意。最后的校验和/哈希和头都应该被使用,因为它们检测不同的东西。报头允许您快速识别您是否拥有正确的密钥,而校验和/哈希检测损坏/篡改。是的,它可以,但是任何非完全随机的明文都可以检查是否正确解密。重要的因素是它消除了静态(甚至半静态)头可能发生的已知明文攻击。
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