C# 解密有效,加密无效

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

我已经将一个旧项目(垃圾,0文档)从asp.net 1.1转换为4.5,效果很好。但是现在我们必须更改与我们的项目交互的项目的连接字符串,以便它指向我们的新sql数据库。我们需要加密新的sqlconnection字符串,但是关于这一点以及它们如何加密字符串的文档为0

我已成功使解密程序工作:

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