Шестнадцатеричный ключ 3DES в функции шифрования Javascript - PullRequest
0 голосов
/ 24 июня 2019

У меня есть функция javascript, использующая CryptoJS для шифрования 8-байтового блока с помощью ключа 3DES.

Функция работает с ключом 01010101010101010101010101010101, но не работает с ключом ADADADADADAD0101ADADADADADAD0202.

    function enc3DES(keyHex){

    var block = "040502CFFFFEFDEE";

    var encrypted = CryptoJS.DES.encrypt(CryptoJS.enc.Hex.parse(block), CryptoJS.enc.Hex.parse(keyHex), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });

        encrypted = encrypted.ciphertext.toString();
        return encrypted.substr(0, 8*2).toUpperCase();
    }

Используя вышеуказанную функцию enc3DES (): Блок 040502CFFFFEFDEE, зашифрованный ключом 01010101010101010101010101010101, является C9478CAA27ABA56A, и этот вывод правильный.

Но для того же блока блок 040502CFFFFEFDEE, зашифрованный ключом ADADADADADAD0101ADADADADADAD0202, имеет тип A413ABD86D52DFFB, и этот вывод неправильный, правильным будет F6A1C5ACA15A50C3.

Не могли бы вы помочь мне понять, почему функция работает нормально только с первой клавишей?

1 Ответ

1 голос
/ 24 июня 2019
  • 3DES (или TripleDES ) не DES . Поэтому CryptoJS.DES должен быть заменен на CryptoJS.TripleDES.

  • Ключ 3DES состоит из 3 сцепленных ключей DES (K1, K2, K3). Существует три варианта ввода : 3TDEA (все три ключа разные), 2TDEA (2 ключа разные и K1 = K3) и третий случай, когда все ключи идентичны, что дает тот же зашифрованный текст, что и DES. Первый ключ

    01010101010101010101010101010101 
    

    соответствует третьему варианту (все клавиши идентичны), клавиша

    ADADADADADAD0101ADADADADADAD0202 
    

    соответствует второму варианту (2TDEA). Поскольку CryptoJS ожидает для 3DES 24-байтовый ключ, ключи

    010101010101010101010101010101010101010101010101
    

    и

    ADADADADADAD0101ADADADADADAD0202ADADADADADAD0101 
    

    должен использоваться.

  • Поскольку открытый текст и зашифрованный текст имеют одинаковую длину, отступы не могут быть Pkcs7. Вместо Pkcs7 можно использовать ZeroPadding или, если открытый текст всегда является целым кратным размеру блока (8 байт для 3DES), NoPadding. Если заполнение изменено, тогда может быть возвращен весь зашифрованный текст (вместо подстроки).

...