Как получить 8-байтный выход из функции шифрования 3DES с использованием CryptoJS? - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно зашифровать 8-байтовый блок с помощью 16-байтового ключа в 3DES Algo и получить 8-байтовый вывод, но в настоящее время вывод больше.

Я пробовал следующую функцию:

function test3DES(){

    var keyHex = "01010101010101010101010101010101" 
    var block = "041234CFFFFEFDEE";

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

    encrypted = CryptoJS.enc.Hex.parse(encrypted.toString());
    alert(encrypted)

}

Ключ: 01010101010101010101010101010101 Блок: 041234CFFFFEFDEE

Используя другие программы, я могу рассчитать требуемый выходной сигнал 241D6DFE12B470D6

Но при попытке запустить вышеупомянутую функцию выводится 000100000c0000000d000000

Не могли бы вы помочь мне понять, почему это происходит?

1 Ответ

0 голосов
/ 19 июня 2019

Ты совсем близко.Вы сериализуете объект в encrypted после выполнения шифрования DES в строку.CryptoJS сериализует эти данные в строку base64.Например.

Давайте возьмем предоставленный вами пример.

var keyHex = "01010101010101010101010101010101" 
var block = "041234CFFFFEFDEE";

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

// encrypted.toString() returns "JB1t/hK0cNZ+QigidzZmwA=="
// What you are interested in is the cipherText

var d = encrypted.ciphertext;
// This size of this ciphertext is 16 bytes. Serializing this
var encryptedHex = d.toString();
// which returns : "241d6dfe12b470d67e422822773666c0"

Учитывая это, вы можете прочитать первые 8 байтов, эквивалентные для вашего варианта использования.Модифицированная версия вашего кода будет выглядеть следующим образом:

function test3DES() {

    var keyHex = "01010101010101010101010101010101" 
    var block = "041234CFFFFEFDEE";

    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();
    alert(encrypted.substr(0, 8*2)); // <-- read the first 8 bytes i.e. 16 bytes of hex string.
}

Надеюсь, это поможет.

...