node.js Расшифровать AES 128 ECB

Я пытаюсь расшифровать токен формата base64 с AES 128-ecb на узле.

ключ: ed9d26Z0JES0X52Q (изменен некоторый символ, но длина правильная)

токен: O4girrZ2YeLSE1sZ4FSIvp3Edm1GiwBLHmvDIEYCf+xkvbxP6EfYjy+PEB2kaYe0606EyPmlCC0iExVRq9e3Iw==

  decodeToken(token) {
    var key = new Buffer(exchangeKey, 'hex')
    var encrypted = new Buffer(token, 'base64')
    decipher = crypto.createDecipheriv("aes-128-ecb", key, '')
    decipher.setAutoPadding(false)
    result = decipher.update(encrypted).toString();
    return result;
  }

дает:

crypto.js: 239 this._handle.initiv (шифр, toBuf (ключ), toBuf (iv)); ^

Ошибка: недопустимая длина ключа при ошибке (собственной) в новом Decipheriv (crypto.js:239:16) в Object.Decipheriv (crypto.js:236:12)

После некоторых поисков я нашел это:

// https://github.com/nodejs/node-v0.x-archive/issues/4744#issuecomment-25460050
var aesEcb = new MCrypt('rijndael-128', 'ecb')
aesEcb.open(exchangeKey);
var ciphertext = new Buffer(token, 'base64');
var plaintext = aesEcb.decrypt(ciphertext).toString();
return plaintext

что возвращает

f9712fa5-da4a-49fe-b81f-b48d8cfabf91275RAODW24RS

что выглядит как ожидаемый формат и длина, но обратите внимание на зашитые символы в конце.

Я тоже мог бы использовать это решение (и обрезать лишние символы), но я хочу

  • знать, что это за персонажи
  • перекрестная ссылка на два результата
  • использовать только один пакет npm (крипто)

person user3568719    schedule 18.06.2018    source источник
comment
Не используйте mcrypt, он не поддерживает заполнение PKCS5. Кроме того, я знаю, что это звучит шокирующе, но причина, по которой вы получаете сообщение об ошибке недопустимой длины ключа, заключается в том, что ключ имеет недопустимую длину вздох. Ваш ключ имеет длину 8 байтов, для AES требуется минимальный размер ключа 16 байтов.   -  person Luke Joshua Park    schedule 18.06.2018
comment
@LukeJoshuaPark тот ключ, который я получил, и mcrypt дает правильный результат с моим 8-байтовым ключом.   -  person user3568719    schedule 18.06.2018
comment
Если ключ представляет собой буквально необработанные шестнадцатеричные символы, то почему вы расшифровываете его как шестнадцатеричный код в своем первом фрагменте кода...?   -  person Luke Joshua Park    schedule 18.06.2018
comment
@LukeJoshuaPark, потому что я слеп :) Спасибо, теперь это работает и дает тот же результат. Что хорошо, а с другой стороны у меня еще остались те уродливые персонажи.   -  person user3568719    schedule 18.06.2018
comment
Потому что вы не используете отступы...   -  person Luke Joshua Park    schedule 18.06.2018
comment
@LukeJoshuaPark, ты снова был прав. Если вы дадите ответ, я приму его как решение.   -  person user3568719    schedule 18.06.2018


Ответы (1)


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

person Luke Joshua Park    schedule 18.06.2018