2011-05-24 104 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