我正在编写一个简单的应用程序,用户可以使用像Rijndael这样的块算法之一加密/解密文件。我必须使用相同的算法加密会话密钥,并将密码文本与xml文件一起存储。用于会话密钥加密的密钥是用户密码的SHA256哈希值。其结果是这样的:用错误的密钥强制解密文件 - C#+ Bouncy Castle
<File>
<EncryptedKey>session key encrypted with user's password hash</EncryptedKey>
<Data>Data encrypted with session key</Data>
</File>
虽然解密,要求用户输入密码,然后生成并用作密钥来解密从XML文件EncryptedKey哈希,然后会话密钥可以用来解密数据。
当用户键入正确的密码时,它会工作,但我希望应用程序解密文件,即使密码错误。我使用Bouncy Castle,现在密码错误(因此会话密钥错误),它会抛出异常“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(),但它也不能工作。
你想要的东西对于你正在使用的库来说是不可能的。该库旨在解密数据或解密数据失败。不抛出异常并保存垃圾数据不会阻止某人试图强制数据,直到结果不是垃圾数据。 – 2011-05-10 18:59:25
我不知道为什么反对票:这是一个合乎要求的问题(当然,他没有在原始问题中列出他的要求,但仍然是......)有时甚至是合法问题的答案是“你不能从这里到达那里。” – AllenG 2011-05-10 19:56:44