解密工作和加密不

时间:2014-08-02 21:02:54

标签: c# sql asp.net encryption cryptography

我已经将一个旧项目(废话,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));
        }

提前致谢

2 个答案:

答案 0 :(得分:5)

这是有问题的:

return Encoding.ASCII.GetString(...);

加密的结果是任意二进制数据。 尝试将其转换为类似的字符串 - 您几乎总会丢失数据。

相反,要么只是将加密数据作为byte[]返回,要么使用类似Base64的内容以可逆方式将其转换为文本:

return Convert.ToBase64String(...);

事实上,在您的解密代码中,您似乎已经假设它是Base64:

byt = Convert.FromBase64String(value);

...所以你甚至不需要更改解密代码。

(顺便说一句,我对使用MD5创建这样的密钥非常怀疑 - 但这是另一回事。哦,目前你无法处理任何非ASCII文本(使用UTF-8代替),你没有明显的原因致电ToCharArray。)

有关此类事情的详细信息,请参阅我的blog post on reversible data transformations,以及如果您将来遇到类似问题,如何逐步分离此过程。

答案 1 :(得分:2)

要使加密器脱离正常工作的解密器(反之亦然),您可以一步一步地反转该过程:

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