C# 解密有效,加密无效
我已经将一个旧项目(垃圾,0文档)从asp.net 1.1转换为4.5,效果很好。但是现在我们必须更改与我们的项目交互的项目的连接字符串,以便它指向我们的新sql数据库。我们需要加密新的sqlconnection字符串,但是关于这一点以及它们如何加密字符串的文档为0 我已成功使解密程序工作:C# 解密有效,加密无效,c#,sql,asp.net,encryption,cryptography,C#,Sql,Asp.net,Encryption,Cryptography,我已经将一个旧项目(垃圾,0文档)从asp.net 1.1转换为4.5,效果很好。但是现在我们必须更改与我们的项目交互的项目的连接字符串,以便它指向我们的新sql数据库。我们需要加密新的sqlconnection字符串,但是关于这一点以及它们如何加密字符串的文档为0 我已成功使解密程序工作: public static string DecryptConnectionString(string value) { string cryptoKey = "xx
public static string DecryptConnectionString(string value)
{
string cryptoKey = "xxxxxxxx";
Byte[] IV = { xxx, x, xx, xx, x, xx,xxx,xx};
Byte[] byt;
byt = Convert.FromBase64String(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length));
}
但是我的加密机坏了,它给了我一个伪造的随机字符字符串(就像一根棍子),当我重新插入解密程序时,它崩溃了
以下是我迄今为止的加密机工作:
public static string EncryptConnectionString(string value)
{
char[] v =value.ToCharArray();
string cryptoKey = "xxxxxxxxx";
Byte[] IV = { xxx, x, xx, xx, x, xx,xxx,xx};
Byte[] byt;
byt = Encoding.ASCII.GetBytes(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateEncryptor().TransformFinalBlock(byt, 0, byt.Length));
}
提前感谢这是个问题:
return Encoding.ASCII.GetString(...);
加密的结果是任意二进制数据。不要试图将其转换为那样的字符串-您几乎总是会丢失数据
相反,只需将加密数据以字节[]
的形式返回,或者使用Base64之类的东西以可逆的方式将其转换为文本:
return Convert.ToBase64String(...);
事实上,在解密代码中,您似乎已经假设它是Base64:
byt = Convert.FromBase64String(value);
。。。因此,您甚至不需要更改解密代码
(顺便说一句,我对使用MD5创建这样的密钥非常怀疑——但那是另一回事。哦,目前您无法处理任何非ASCII文本(改用UTF-8),并且您调用tocharray
,没有明显的原因。)
有关这类事情的更多详细信息,请参阅my,以及如果将来遇到类似问题,如何逐步分解该过程。要使用正常工作的解密程序制作加密程序(反之亦然),可以逐步反转该过程:
byt = Convert.FromBase64String(value);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
return Encoding.ASCII.GetString(des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length));
取出与制键相关的部分,分离函数调用:
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
des.Key = md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(cryptoKey));
des.IV = IV;
byt = Convert.FromBase64String(value);
byte[] decrypted = des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length)
return Encoding.ASCII.GetString(decrypted);
然后按顺序颠倒操作:
// here lies the key-making code
return Encoding.ASCII.GetString(decrypted);
byte[] decrypted = des.CreateDecryptor().TransformFinalBlock(byt, 0, byt.Length)
byt = Convert.FromBase64String(value);
最后,在实际操作中反转每一个(输入变为输出,解密变为加密,等等):
我键入了答案,然后看到了你的博客文章,现在我很尴尬!
// here lies the key-making code
byt = Encoding.ASCII.GetBytes(value);
byte[] encrypted = des.CreateEncryptor().TransformFinalBlock(byt, 0, byt.Length)
return Convert.ToBase64String(encrypted);