Шифрование TripleDES имеет разные результаты в C# и JavaScript (Crypto JS) - PullRequest
1 голос
/ 02 апреля 2020

Я работаю над проектом, который использует внешний API, который написан на C#. В этом API мне нужно отправить некоторые зашифрованные данные, используя их ключ, который был предоставлен при запуске session.

Мой проект построен с использованием NodeJS, поэтому для шифрования я использую модуль CryptoJS . Во время разговора с разработчиком API он прислал мне код, показывающий, как выполняется шифрование в C#. Вот код с примером key и value для шифрования.

    TripleDESCryptoServiceProvider mDes = new TripleDESCryptoServiceProvider();
    mDes.Key = Convert.FromBase64String("bv8czu/UPuZg6xNxnJAD/vRtbng9mQZX");
    mDes.Mode = CipherMode.ECB;
    mDes.Padding = PaddingMode.Zeros;
    ICryptoTransform mDesEnc = mDes.CreateEncryptor();
    byte[] data = Encoding.UTF8.GetBytes("1"); //value to encrypt
    var crypto = Convert.ToBase64String(mDesEnc.TransformFinalBlock(data, 0, data.Length));
    Console.WriteLine(crypto);

Это приводит к следующему шифрованию: 3EAaQjY2dgA =

Как вы можно увидеть в коде или при его запуске, шифрование использует 3DES, режим ECB, заполнение нулями и ключ, в то время как в формате байтового массива имеет 24 байта.

Поэтому я начал воссоздавать этот код в JavaScript и закончилось этим:

    var CryptoJS = require("crypto-js");
    var encryptStringWith3DES = function(toEncrypt, key){
        toEncrypt = "1";
        key = "bv8czu/UPuZg6xNxnJAD/vRtbng9mQZX";
        key = CryptoJS.enc.Utf8.parse(key);

        console.log(toEncrypt + "     " + key);

        var encrypted = CryptoJS.TripleDES.encrypt(toEncrypt, key,{
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.ZeroPadding
        }).toString();

        console.log(encrypted);
    }

И это приводит к следующему шифрованию: dj1byXBV6ug =

Я искал много ответов, но ни один не работал. Я подозреваю, что CryptoJS получает ключ в качестве параметра и как ключ и данные анализируются.

Кто-нибудь из вас знает, как заставить мой код JS приводить к тем же зашифрованным данным, что и C# один?

...