Расшифровка шестнадцатеричного сообщения AES для завершения взаимной аутентификации с сервером - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь следовать этим инструкциям, предоставленным справочным документом:

Переменная A содержит последовательность 16-байтовых случайных чисел, зашифрованных с помощью переменной B.

Вам следует расшифровать ее с помощью переменнойB и добавляет его в конец переменной A.

Общая 32-байтовая переменная будет расшифрована с использованием переменной B и отправлена ​​обратно на сервер для успешной аутентификации.

Выследует использовать режим шифрования CES AES128 для расшифровки.

Переменная A (16 байт): e06e3e2ea024bba1185c33d64d2033b6
Переменная B (16 байт): 41435231323535552d4a312041757468

Моя попытка вCryptoJS

const message = 'e06e3e2ea024bba1185c33d64d2033b6';
const key = '41435231323535552d4a312041757468';

const decryptedMsg = CryptoJS.AES.decrypt(
  message,
  key,
  {
    mode: CryptoJS.mode.CBC,
  }
);

console.log(decryptedMsg.toString());

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

1 Ответ

1 голос
/ 09 ноября 2019
  • Следующее относится к параметрам decrypt -метода, здесь :

    1. параметр: зашифрованный текст как CipherParams (еслиздесь передается строка, по умолчанию она декодируется Base64, что здесь не предназначено)
    2. параметр: ключ как WordArray (если здесь передана строка, она интерпретируется как фраза-пароль, из которой получены ключ и IVчто здесь не предусмотрено)
    3. параметр: режим, вектор инициализации (IV) и заполнение

    Затем вы можете расшифровать его следующим образом:

    var CryptoJS = require("crypto-js"); 
    
    function decrypt(hexCiphertext, hexKey, hexIV){    
        var cipherParams = CryptoJS.lib.CipherParams.create(
            {ciphertext: CryptoJS.enc.Hex.parse(hexCiphertext)}
        );
        var key = CryptoJS.enc.Hex.parse(hexKey);
        var iv = CryptoJS.enc.Hex.parse(hexIV);
        var decrypted = CryptoJS.AES.decrypt(
            cipherParams,
            key,
            {iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC}
        );
        return decrypted;
    }
    
  • В режиме CBC используется IV, который следует взять из спецификации. Результат зависит от этого IV, то есть, если вы используете неправильный IV, расшифровка даст неправильный результат. Если в спецификации нет IV, вы можете только угадать и попробовать, например, 0 -вектор на удачу. Обивка также должна быть взята из спецификации. Поскольку согласно описанию первой части дешифрования зашифрованное и дешифрованное сообщение имеют одинаковую длину (а именно 16 байт), очевидно, что заполнение (CryptoJS.pad.NoPadding) не используется.

  • Следующее применимо к первой части расшифровки (при условии 0 -вектор для IV):

    var hexMessage = 'e06e3e2ea024bba1185c33d64d2033b6';
    var hexKey = '41435231323535552d4a312041757468';
    var hexIV = '00000000000000000000000000000000';
    var decryptedStep1 = decrypt(hexMessage, hexKey, hexIV);
    var hexDecryptedStep1 = CryptoJS.enc.Hex.stringify(decryptedStep1)
    console.log(hexDecryptedStep1);
    

    со следующим выводом:

    93fd6fa1ee388d326535abf7bd66310a
    

    и длявторая часть (предполагая 0 -вектор для IV):

    var hexMessageStep2 = hexMessage + hexDecryptedStep1;
    var decryptedStep2 = decrypt(hexMessageStep2, hexKey, hexIV);
    var hexDecryptedStep2 = CryptoJS.enc.Hex.stringify(decryptedStep2);
    console.log(hexDecryptedStep2);
    

    со следующим выводом:

    93fd6fa1ee388d326535abf7bd66310ac57db5bd524becba57445a9dbc536d0d 
    
...