繁体   English   中英

关闭密码流时 C# 中的 DES 解密错误“错误数据”

[英]DES decryption error “Bad Data” in C# when closing cryptostream

我尝试解密一个加密的字节数组(用 K1 加密并用 K2 解密)。 Visual Studio 在尝试关闭我的加密 stream 时抛出异常“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 的建议,我在这里发布了我的加密代码片段。 加密的 output 是解密的输入(两个不同的密钥)

        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;
    }

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

由于在解密密文时使用了填充,因此加密流会在您检索解密的字节时尝试删除填充。 由于您不使用加密数据的密钥,因此您将得到“垃圾”......密码流无法检测到需要删除的填充,并且操作失败并出现观察到的异常。

如果您想使用 DES class 重建 3DES 之类的东西,请使用 PaddingMode NONE 进行解密和以下加密步骤(因此只有第一次加密或最后一次解密使用填充)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM