'Bad Data'使用DES3解密消息时

时间:2009-06-01 09:45:50

标签: c# encryption

C#2008

我使用以下代码来加密和加密邮件。但是,当我尝试解密时,我收到“错误数据”错误。

我的代码下面有什么问题吗?

非常感谢,

public string encryptText(string text)
    {
        try
        {
            TripleDESCryptoServiceProvider encrypt = new TripleDESCryptoServiceProvider();

            encrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 };
            encrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 };
            byte[] byteText = Encoding.Unicode.GetBytes(text);

            ICryptoTransform encryptor = encrypt.CreateEncryptor();

            byte[] encryptedText = encryptor.TransformFinalBlock(byteText, 0, byteText.Length);

            return Encoding.Unicode.GetString(encryptedText);
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);

            return ex.Message;
        }

    }

    /// Decrypt the text
    public string decryptText(string encryptedText)
    {
        try
        {
            byte[] bytesText = Encoding.Unicode.GetBytes(encryptedText);

            TripleDESCryptoServiceProvider decrypt = new TripleDESCryptoServiceProvider();

            decrypt.Key = new byte[] { 0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 144, 89, 55, 34, 21, 13, 8, 5, 3, 2, 1, 0 };
            decrypt.IV = new byte[] { 1, 2, 3, 5, 8, 13, 21, 34 };

            ICryptoTransform decryptor = decrypt.CreateDecryptor();

            byte[] originalText = decryptor.TransformFinalBlock(bytesText, 0, encryptedText.Length);

            return Encoding.Unicode.GetString(originalText);
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);

            return ex.Message;
        }
    }

2 个答案:

答案 0 :(得分:5)

您正在使用加密字节并使用Encoding.Unicode将它们转换为字符串,但随后您将使用字符串并使用Encoding.Default将其转换回字节。这几乎保证无法正常工作(除非默认情况下是UTF-16)。

但是,您应该使用 - 使用编码将任意二进制数据转换为文本是一个坏主意。请使用Convert.ToBase64String(在加密器中)和Convert.FromBase64String(在解密器中)。

(我也非常想知道返回异常消息的智慧,好像它是加密/解密的成功结果,但希望你只是为了示例代码而这样做。)

答案 1 :(得分:1)

是的,代码中有一些错误。

  • encryptedText和bytesText必须是相同的字节数组。正如Jon Skeet建议您可以使用Base64编码。

  • IV是密文的一部分。因此,您在解密时不必设置IV。

  • 默认的加密模式是CBC。此模式要求IV是随机的(rsp。不可预测)。因此,加密时不得设置固定的IV。创建CryptoServiceProvider时,已经设置了随机IV。因此,用固定值覆盖IV会降低您的安全性。

  • 将密钥明确地放在代码中并不是一个好主意。我希望你的代码离开实验状态后你就会改变它。

  • 有没有理由使用TripleDes?否则,您可能需要考虑使用AES。