2011-05-24 108 views
0

我嘗試解密加密的字節數組(用K1加密並用K2解密)。當它試圖關閉我的密碼流關閉密碼流時C#中的DES解密錯誤「Bad Data」

這裏是我的DES解密

public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv) 
    { 
     MemoryStream ms = new MemoryStream(); 
     DES mDES = DES.Create(); 
     mDES.Key = key; 
     mDES.IV = iv; 
     mDES.Padding = PaddingMode.PKCS7; 
     CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write); 
     cs.Write(cipherData, 0, cipherData.Length); 
     cs.Close(); 
     Byte[] decryptedData = ms.ToArray(); 
     return decryptedData; 
    } 

的代碼片段的初始向量是相同的加密Visual Studio中拋出一個異常「BAD DATA」。我不知道爲什麼會發生此錯誤。

補充: 所推薦的格雷格B,我張貼在這裏的加密我的代碼段。加密的輸出是解密輸入(兩個不同的密鑰)

 public Byte[] Decrypt(Byte[] cipherData, Byte[] key, Byte[] iv) 
    { 
     MemoryStream ms = new MemoryStream(); 
     DES mDES = DES.Create(); 
     mDES.Key = key; 
     mDES.IV = iv; 
     mDES.Padding = PaddingMode.PKCS7; 
     CryptoStream cs = new CryptoStream(ms, mDES.CreateDecryptor(), CryptoStreamMode.Write); 
     cs.Write(cipherData, 0, cipherData.Length); 
     cs.Close(); 
     Byte[] decryptedData = ms.ToArray(); 
     return decryptedData; 
    } 
+0

如果解密時,它拋出一個異常,你的加密程序可能有問題。也許值得發佈該代碼太... – 2011-05-24 08:01:58

+0

看看這裏:http://stackoverflow.com/questions/5591361/c-bad-data-exception-when-decrypting-encrypted-file – 2011-05-24 08:09:33

+0

我看了一下鏈接建議通過Alireze,但在我看來,它不能解決我的問題:( – 2011-05-24 08:17:06

回答

2

您遇到的問題來自選定的填充模式。

因爲在解密密文時使用了填充,所以當您檢索解密的字節時,cryptostream會嘗試刪除填充。由於您沒有使用密鑰加密數據,因此您將得到「垃圾」...... cryptostream無法檢測到需要刪除的填充,並且操作失敗並顯示觀察到的異常。

,如果你想rebuld someething像3DES與DES類使用PaddingMode NONE爲您解密和下面的加密步驟(所以只有第一加密或最後解密使用填充)

+0

謝謝。這正是我的問題。 – StarCub 2011-11-16 09:16:59

+0

謝謝!好的提示! – 2016-04-14 15:29:37