Вопрос по node.js, openssl, cryptography, aes – Что не так с крипто-расшифровкой nodejs?

16

У меня есть следующие зашифрованные данные:

U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o

Пропуск для расшифровки это:password

(это пример изтарабарщину-АЕС)

В командной строке с помощью openssl:

echo "U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o" | openssl enc -d -aes-256-cbc -a -k password

Выход:

Made with Gibberish\n

С моим приложением NodeJS:

  var decipher = crypto.createDecipher('aes-256-cbc', "password");
  var dec = decipher.update("U2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o",
     'base64', 'utf8');
  dec += decipher.final('utf8');

У меня следующая ошибкаTypeError: DecipherFinal fail наdecipher.final линия.

Я что-то пропустил ? Благодарю.

Я посмотрел в коде, и он должен использовать вывод ключа openssl без соли. Я не уверен насчет IV. Я знаю, что с Java я не могу расшифровать результат openssl либо. Участок сгущается. Maarten Bodewes
@owlstead, который я использовалkey а такжеiv напрямую, это используетPBKDF2? pastebin.com/uhxTRn9T вот мой код и результаты. Что случилось? o_nix
Отличный вопрос Я обнаружил, что openssl использует соль каждый раз, поэтому вам нужно-nosalt переключатель. Без соли он использует тот же IV и производный ключ каждый раз, вы можете увидеть, что они обеспечивают-p переключатель. Тогда вы можете сделатьcreateDecipheriv(data, key, iv) в узле. Но он все равно не декодирует текст должным образом. Так что я тоже застрял. o_nix

Ваш Ответ

1   ответ
15

что есть соль (кодировка ASCII"Salted__"). Тогда следующие 8 байтов - это соль. Теперь плохие новости: Node.js, похоже, не использует соль для метода EVP_BytesToKey:

int key_len = EVP_BytesToKey(cipher, EVP_md5(), NULL,
  (unsigned char*) key_buf, key_buf_len, 1, key, iv);

ТотNULL это соль.

Это было проверено с помощью тестового приложения Java (с использованием правильной соли) - возвращена строка результата.

Пожалуйста, не используйте соль, используя OpenSSL-nosalt переключитесь и попробуйте снова.

[ПРИМЕР]

OpenSSL CLI:

openssl enc -aes-256-cbc -nosalt -a -k password
owlstead
Mh5yxIyZH+fSMTkSgkLa5w==

NodeJS crypto:

var crypto=require('crypto')
var cipher=crypto.createDecipher('aes-256-cbc', "password")
var enc = cipher.update("Mh5yxIyZH+fSMTkSgkLa5w==", 'base64', 'utf8')
enc += cipher.final('utf8')

[ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ] Обратите внимание, что использование секретного ключа с солевой и большой трудовой фактор может иметь первостепенное значение для безопасности. Вам лучше использовать очень уникальный пароль с высокой энтропией, иначе ваши зашифрованные данные могут оказаться под угрозой.

[Действительно поздно редактировать]OpenSSL 1.1.0c изменил алгоритм дайджеста используется в некоторых внутренних компонентах. Раньше использовался MD5, а 1.1.0 переключался на SHA256. Будьте осторожны, изменения не влияют на вас обоихEVP_BytesToKey и такие команды, какopenssl enc.

зашифрованные данные после декодирования Base64, очевидно.
Как вы шифруете, используя узел crypto с опцией -nosalt?
ТотU2FsdGVkX1+21O5RB08bavFTq7Yq/gChmXrO3f00tvJaT55A5pPvqw0zFVnHSW1o Строка однако содержит соль. Вы можете легко увидеть, что в противном случае он слишком большой (даже если вы просто не декодируете base64 и не просматриваете ASCII-кодированные первые 8 байтов).
Но я пользуюсь-nosalt как я уже говорил ... я знаю оSalted__ Волшебная подпись в результатах кодирования OpenSSL по умолчанию. Мой пример пастбина содержит-nosalt.
я не понимаю ... вы не можете использовать "-nosalt" если вы не контролируете шифрование. Что делать, если вам нужно расшифровать файлы, уже зашифрованные с солью?

Похожие вопросы