我有一个非常大的代码块(隐藏几秒钟)。
我使用KeyA加密它。
在此过程的后期,我收到一把钥匙(不一定是KeyA)......
但是我还不需要打开挡块,
我真正需要的是验证这确实是正确打开代码的密钥。
我假设我可以保留一个已知块并加密它, 并且为了验证密钥,只打开它,但感觉就像削弱了密码学的力量(蛮力更容易,人们可以学习关键属性的一些事情)。
答案 0 :(得分:2)
我假设您正在使用Symmetric-Key Cryptography(用于解密文件的密钥与用于加密密钥的密钥相同)。
如果密码容易受到Known-Plaintext Attack的攻击,那么已知的明文块可能会显示有关密钥的信息。用于ZIP文件的流密码受此problem影响。由于ZIP是压缩的,因此很难猜出足够的纯文本,但用于验证密码的校验和(以及其他因素)有助于为实际的attack提供足够的纯文本。
原则上,您可以公开KeyA的哈希值(假设哈希算法足够强大,无法逆转,并且哈希算法也不会被密码内部使用)。这样您就可以快速拒绝无效密钥,而无需更改邮件的加密方式。
进一步考虑这个想法,你可以使用Message authentication code,例如HMAC。消息验证代码将验证消息(在这种情况下是您的非常大的代码块,或者可能只是其文件路径)未被篡改,以及验证密钥是否正确。
如果您担心这会使蛮力更容易或暴露密钥的属性,您可以将密钥分成两部分。密钥的第一部分可以纯粹用于验证,第二部分纯粹用于解密。例如MyKey = AuthenticationPart,DecryptionPart
(免责声明:这是基于我对加密的非常不完全的理解。您可能会在security.stackexchange.com和/或crypto.stackexchange.com上获得更好的回复。