0

コード内に暗号化されたパスワードがあり、それを復号化して使用する従来の 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 値は同じ長さです。私はこれが鉄道を走らせる方法ではないことを知っています。明白で、簡単で、ばかげた何かが欠けていることを願っています。

4

1 に答える 1

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);
于 2013-02-27T21:13:43.483 に答える