寻找加密解密

时间:2013-02-27 20:36:34

标签: c# encryption

我有遗留的C#代码,代码中有加密密码,解密并使用它。我现在必须更改实际的源值,即base64字符串需要更改。

解密代码:

        var des = new TripleDESCryptoServiceProvider();
        var md5Hash = new MD5CryptoServiceProvider();

        des.Key = md5Hash.ComputeHash(Encoding.Unicode.GetBytes(...key...));
        des.Mode = CipherMode.ECB;

        var desDecrypt = des.CreateDecryptor();
        var buffer = Convert.FromBase64String(...value...);
        var result = Encoding.Unicode.GetString(desDecrypt.TransformFinalBlock(buffer, 0, buffer.Length));
        return result;

我正在尝试对更改后的值进行临时重新加密,如下所示:

        var des = new TripleDESCryptoServiceProvider();
        var md5Hash = new MD5CryptoServiceProvider();

        des.Key = md5Hash.ComputeHash(Encoding.Unicode.GetBytes(...key...));
        des.Mode = CipherMode.ECB;

        var desEncrypt = des.CreateEncryptor();
        var s = "...new value...";
        var b = Encoding.Unicode.GetBytes(s);
        desEncrypt.TransformFinalBlock(b, 0, b.Length);
        var x = Convert.ToBase64String(b);

这给了我一个很好的base64值来替换我的旧常量。但是,当代码尝试解密这个新值时,我得到了一个

  

System.Security.Cryptography.CryptographicException:长度   要解密的数据无效。

源值具有相同的长度。 base64值具有相同的长度。我知道这是无法经营铁路的。我只是希望我错过了一些明显,简单和/或愚蠢的东西。

1 个答案:

答案 0 :(得分:2)

看起来你实际上并没有使用3DES加密的输出:

var b = Encoding.Unicode.GetBytes(s);
// This returns the encrypted data, but you're not storing it anywhere
desEncrypt.TransformFinalBlock(b, 0, b.Length);
// b is still the original input, not the encrypted data
var x = Convert.ToBase64String(b);

试试这个:

var b = Encoding.Unicode.GetBytes(s);
// Store encrypted data in "e"
var e = desEncrypt.TransformFinalBlock(b, 0, b.Length);
// Convert the encrypted data to base64
var x = Convert.ToBase64String(e);