2011-05-10 90 views
0

我正在编写一个简单的应用程序,用户可以使用像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(),但它也不能工作。

+0

你想要的东西对于你正在使用的库来说是不可能的。该库旨在解密数据或解密数据失败。不抛出异常并保存垃圾数据不会阻止某人试图强制数据,直到结果不是垃圾数据。 – 2011-05-10 18:59:25

+0

我不知道为什么反对票:这是一个合乎要求的问题(当然,他没有在原始问题中列出他的要求,但仍然是......)有时甚至是合法问题的答案是“你不能从这里到达那里。” – AllenG 2011-05-10 19:56:44

回答

2

这相当不好加密的地步首先。据推测,你可以捕捉到异常,并在你的catch块中写入垃圾数据(可能是异常堆栈的十六进制转储?)到一个文件 - 但为什么?正如Ramhound所指出的那样,这会给恶意用户数据提供可用于暴力攻击的数据,以便与成功解密文件的时间进行比较。

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

+0

我知道显示消息是最合适的方法,至少在我看来,但我的应用程序的要求之一是生成解密文件,即使它可能包含垃圾字节。 – 2011-05-10 18:59:40

+0

我会得到澄清。有人可能会想:“好吧,如果文件解密了,但它不包含任何有用的东西?” (是的,我已经讨论过了)在这种情况下,写'垃圾字节'是为了证明你只有垃圾字节。如果他们想要垃圾字节而不是错误信息,那么这是一个非常糟糕的做法。 – AllenG 2011-05-10 19:55:15

相关问题