强制使用错误的密钥解密文件 - C# + 充气城堡
本文关键字:城堡 文件 解密 错误 密钥 | 更新日期: 2023-09-27 17:55:47
我正在编写一个简单的应用程序,用户可以在其中使用Rijndael等块算法之一加密/解密文件。我还必须使用相同的算法加密会话密钥,并将其与密文一起存储在 xml 文件中。用于会话密钥加密的密钥是用户密码的 SHA256 哈希。结果是这样的:
<File>
<EncryptedKey>session key encrypted with user's password hash</EncryptedKey>
<Data>Data encrypted with session key</Data>
</File>
解密时,要求用户键入密码,然后生成哈希并用作从xml文件解密EncryptedKey的密钥,然后可以使用会话密钥解密数据。
当用户键入正确的密码时,它可以工作,但我希望应用程序解密文件,即使密码错误。我正在使用充气城堡,现在当密码错误(因此会话密钥也错误)时,它会抛出异常"Pad 块已损坏"。我不想显示任何消息框来通知发生错误。相反,无论如何我都想解密文件并因此保存垃圾。这可能吗?我的解密代码:
IBufferedCipher cipher = CipherUtilities.GetCipher("Rijndael/ECB/PKCS7Padding");
KeyParameter par = new KeyParameter(generateHash(password));
cipher.Init(false, par);
byte[] output = cipher.DoFinal(data); // Exception here when password is wrong
我还尝试先使用 ProcessBytes() 方法,最后使用 DoFinal(),但也没有用。
这首先完全违背了加密的意义。 大概你可以捕获异常,并在你的catch块中,将垃圾数据(可能是异常堆栈的十六进制转储?)写入文件 - 但为什么呢? 正如Ramhound所指出的,这将提供可用于暴力攻击的恶意用户数据,以与他们成功解密文件的时间进行比较。
我会回到这个假设/设计阶段:为什么你想避免显示一条消息,指出"提供的密码与预期的密码不匹配。 请重新输入。 还剩下3次尝试。(或其他什么)? 输出"垃圾"文件有什么好处?