C#和Cryptojs的TripleDESCryptoServiceProvider给出不同的结果

问题描述 投票:0回答:1

我真的需要你的帮助。我已经做了一个星期了。为什么使用c#和javascript cryptojs在TripplesDes上进行加密时会得到不同的结果?请在下面查看我的代码。

c#

public static string EncryptTxt()
{
    SHA512CryptoServiceProvider sha = new SHA512CryptoServiceProvider();

    using (var tdes = new TripleDESCryptoServiceProvider())
    {
        var msg = 'jvofs:JCV XXXXX:201911141547:12345678';
        var key = 'jjvofs';
        var keyOffset = 10;

        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

        byte[] Results;
        byte[] newKeyx = new byte[24];

        byte[] keybyte = sha.ComputeHash(Encoding.UTF8.GetBytes(key));

        Array.Copy(keybyte, keyOffset, newKeyx, 0, newKeyx.Length);

        TDESAlgorithm.Key = newKeyx;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        byte[] DataToEncrypt = UTF8.GetBytes(msg);
        try
        {
            ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
            Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
        }
        finally
        {
            TDESAlgorithm.Clear();
        }
        var a = Convert.ToBase64String(DataToEncrypt);
        var b = Convert.ToBase64String(newKeyx);
        var c = Convert.ToBase64String(Results);
        return Convert.ToBase64String(Results);
    }
}

[使用cryptojs的JavaScript

txtEncrypter = () => {
    const msg = 'jvofs:JCV XXXXX:201911141547:12345678';
    const key = 'jjvofs';
    const keyOffset = 10;
    const keybyte: any = this.wordArrayToByteArray(crypto.SHA512(key), 100);

    // For message
    const dataToEncrypt = crypto.enc.Utf8.parse(msg);
    const dte = this.wordArrayToByteArray(dataToEncrypt, 100);
    const dataToEncryptx = this._arrayBufferToBase64(dte);
    const dataToEncryptxx = crypto.enc.Utf8.parse(dataToEncryptx);

    // For key
    let newKeyx = keybyte.slice(keyOffset, 34);
    const newKeyxB4Splice = newKeyx;
    const newKeyxB4Splicex = this._arrayBufferToBase64(newKeyx);
    newKeyx = crypto.enc.Utf8.parse(newKeyx);

    const options = {
      mode: crypto.mode.ECB,
      padding: crypto.pad.Pkcs7
    };

    const encrypted = crypto.TripleDES.encrypt(dataToEncrypt, newKeyx, options);
    const base64String = encrypted.toString();
    console.log(base64String);
  }

解析消息和密钥的数据时,c#和javascript都是相同的:

消息:

[[C#] anZvZnM6SkNWIFhYWFhYOjIwMTkxMTE0MTU0NzoxMjM0NTY3OA ==

[cryptojs] anZvZnM6SkNWIFhYWFhYOjIwMTkxMTE0MTU0NzoxMjM0NTY3OA ==

键:

[C#] smbkkmDrCBdRev7S4hLaWE16Nvym + 9gW

[cryptojs] smbkkmDrCBdRev7S4hLaWE16Nvym + 9gW

但是只要“ crypto.TripleDES.encrypt(....)”运行,我就会得到c#和javascript的不同结果:

[[C#] 1pjvBOB81iAOqsskZ + cM080yDU37XBoCwMhbYULwva / Nql5vbEMiPQ ==

[cryptojs] ncCcCYNy3jVsB / 95SaC2N1rH5Q + hX04WvScMvwmtkPkrnL7Ki1bmPg ==

请帮助我。非常感谢。

javascript c# cryptojs tripledes
1个回答
0
投票

查看我的评论

    public static string EncryptTxt()
    {
        SHA512CryptoServiceProvider sha = new SHA512CryptoServiceProvider();

        using (var tdes = new TripleDESCryptoServiceProvider())
        {
            var msg = "jvofs:JCV XXXXX:201911141547:12345678";
            var key = "jjvofs";
            var keyOffset = 10;

            var UTF8 = new UTF8Encoding();
            var TDESAlgorithm = new TripleDESCryptoServiceProvider();

            byte[] Results;
            byte[] newKeyx = new byte[24];

            // keybyte = 64 bytes
            byte[] keybyte = sha.ComputeHash(Encoding.UTF8.GetBytes(key));

            // now you copy byte 10..33 from the keybyte[64] into newKeyx[24]
            // why???
            Array.Copy(keybyte, keyOffset, newKeyx, 0, newKeyx.Length);

            TDESAlgorithm.Key = newKeyx;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;
            byte[] DataToEncrypt = UTF8.GetBytes(msg);
            try
            {
                var Encryptor = TDESAlgorithm.CreateEncryptor();
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
            }
            finally
            {
                TDESAlgorithm.Clear();
            }
            var a = Convert.ToBase64String(DataToEncrypt);
            var b = Convert.ToBase64String(newKeyx);
            var c = Convert.ToBase64String(Results);
            return Convert.ToBase64String(Results);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.