Шифрование с CryptoJS с использованием Triple DES в режиме ECB и заполнением PKCS # 5 - PullRequest
0 голосов
/ 08 февраля 2019

Я шифрую строки перед отправкой в ​​сторонний API, который требует шифрования Triple DES в режиме ECB с заполнением PKCS # 5.Они дали мне образец строки для шифрования

www.society.com | 1084470043000 | memberaccess

и образец ключа

92f2f81930b5afb056630afb02f2f8b1

Полученная зашифрованная строка должна совпадать с

uQlYYov + XlVEHL0JBpvt15FeJxt + fXgjs9KLJHH5X * * * * * 8 * * * * 5 * * * * 5 * * * * 5 * * 5 * * 5x5 * 0x6x5X6X51019 *

U2FsdGVkX19 / IR4A9cm + duXf3vhnmnuyJtXFVWJi / Ptqib7g5gOANppYXh + mTQ8tcenO58a5FxnFVxRq1PUETA ==

10 * * * * * * **

var encrypted = CryptoJS.TripleDES.encrypt("www.society.com|1084470043000|memberaccess" , "92f2f81930b5afb056630afb02f2f8b1", {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

Я понимаю, что я указываю PKCS # 7 вместо PKCS # 5, но я не нашел библиотеку для PKCS # 5.

Мой вопрос заключается в том, можно ли удовлетворить их требования с помощью CryptoJS, и если нет, то есть ли какие-либо другие решения javascript?

Моя скрипка

https://jsfiddle.net/dwc6zb89/2/

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

public static string Encrypt(string toEncrypt, bool useHashing)
{
    var key = "92f2f81930b5afb056630afb02f2f8b1";

    var iso8859_1 = System.Text.Encoding.GetEncoding("iso-8859-1");

    var keyArray = Convert.FromBase64String(iso8859_1.GetString(iso8859_1.GetBytes(key)));


    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);




    if (useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();

        //Always release the resources and flush data
        // of the Cryptographic service provide. Best Practice

        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    //set the secret key for the tripleDES algorithm
    tdes.Key = keyArray;
    //mode of operation. there are other 4 modes.
    //We choose ECB(Electronic code Book)
    tdes.Mode = CipherMode.ECB;
    //padding mode(if any extra byte added)

    tdes.Padding = PaddingMode.PKCS7;

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    //transform the specified region of bytes array to resultArray
    byte[] resultArray =
      cTransform.TransformFinalBlock(toEncryptArray, 0,
      toEncryptArray.Length);
    //Release resources held by TripleDes Encryptor
    tdes.Clear();
    //Return the encrypted data into unreadable string format
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

Обновление:

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

var encryptedKey = CryptoJS.enc.Base64.parse(key);

я могу сгенерировать зашифрованное значение, которое находится всего в нескольких символах от образца, предоставленного мне продавцом.Это моя текущая скрипка.

https://jsfiddle.net/uv8z2mrc/1/

Обновление:

У меня было две проблемы.

  1. Мне нужно было основать64 зашифруйте мой ключ перед его использованием следующим образом.

    var encryptedKey = CryptoJS.enc.Base64.parse (key);

  2. Документация поставщика неверна, и значениедля шифрования предполагалось использовать адрес .org вместо .com.GRRR!

1 Ответ

0 голосов
/ 08 февраля 2019

Из документов CryptoJS:

Для ключа, когда вы передаете строку, он обрабатывается как фраза-пароль и используется для получения фактического ключа и IV.Или вы можете передать WordArray, который представляет фактический ключ.Если вы передаете фактический ключ, вы также должны передать фактический IV.

Вы должны шестнадцатеричное декодирование ключа в массив слов, а также дать 16-байтовый IV, установленный для всех нулевых байтов.IV не используется ЕЦБ, но, пожалуйста, укажите его.В противном случае ключ будет выведен из строки, что, очевидно, приведет к неверным результатам.

...