关闭cryptostream时,C#中的DES解密错误“Bad Data”

时间:2011-05-24 07:49:50

标签: c# .net encryption des

我尝试解密加密的字节数组(用K1加密并用K2解密)。 Visual Studio在尝试关闭加密流时抛出异常“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;
    }

初始向量与加密相同。我不知道为什么会出现这个错误。

加了: 的 根据Greg 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;
    }

1 个答案:

答案 0 :(得分:3)

您遇到的问题来自所选的填充模式。

因为在解密密文时使用了填充,所以当检索解密的字节时,cryptostream会尝试删除填充。由于你没有使用数据加密的密钥,你将得到“垃圾”...... cryptostream无法检测到需要删除的填充,并且操作因观察到的异常而失败。

如果你想使用DES类重新使用像3DES这样的东西,请使用PaddingMode NONE进行解密,然后使用以下加密步骤(所以只有第一次加密或最后一次解密使用填充)