2011-05-10 106 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

相關問題