我正在编写一个简单的应用程序,用户可以使用其中一种块算法(如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(),但它也不起作用。
答案 0 :(得分:2)
首先,这很好地违背了加密的要点。大概你可以捕获异常,并在你的catch块中,将垃圾数据(可能是异常堆栈的十六进制转储?)写入文件 - 但为什么呢?正如Ramhound所指出的那样,这会产生恶意用户数据,这些数据可用于暴力攻击,以便与成功解密文件时进行比较。
我会回到这个假设/设计阶段:为什么你要避免显示一条消息,说明“提供的密码与预期密码不符。请重新输入.3尝试保留。” (管他呢)?通过输出“垃圾”文件获得了什么?