强制用错误的密钥解密文件 - C#+ Bouncy Castle

时间:2011-05-10 18:27:04

标签: c# encryption bouncycastle

我正在编写一个简单的应用程序,用户可以使用其中一种块算法(如Rijndael)加密/解密文件。我必须使用相同的算法加密会话密钥,并将其与密文一起存储在xml文件中。用于会话密钥加密的密钥是用户密码的SHA256哈希。结果如下:

<File>
    <EncryptedKey>session key encrypted with user's password hash</EncryptedKey>
    <Data>Data encrypted with session key</Data>
</File>

在解密时,要求用户输入密码,然后生成散列并将其用作从xml文件解密EncryptedKey的密钥,然后会话密钥可用于解密数据。

当用户键入正确的密码时,它可以正常工作,但即使密码错误,我希望应用程序解密文件。我正在使用Bouncy Castle,现在当密码错误时(因此会话密钥错误),它会抛出异常“Pad block corrupted”。我不想显示任何消息框通知发生错误。相反,我想要解密文件,结果只是保存垃圾。那可能吗?我的解密代码:

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(),但它也不起作用。

1 个答案:

答案 0 :(得分:2)

首先,这很好地违背了加密的要点。大概你可以捕获异常,并在你的catch块中,将垃圾数据(可能是异常堆栈的十六进制转储?)写入文件 - 但为什么呢?正如Ramhound所指出的那样,这会产生恶意用户数据,这些数据可用于暴力攻击,以便与成功解密文件时进行比较。

我会回到这个假设/设计阶段:为什么你要避免显示一条消息,说明“提供的密码与预期密码不符。请重新输入.3尝试保留。” (管他呢)?通过输出“垃圾”文件获得了什么?