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;
}
}
答案 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。