0

Я зашифрованное слово HelloWorld с помощью nodejs-AES256 https://www.npmjs.com/package/nodejs-aes256 с ключом apple выход был 1ivBqj+nVPcHvZjQlx7Di0SoxV49bNpWtog= тогда я зашифрован же слова с тем же ключом, используя интерактивный инструмент http://aesencryption.net/ выхода был LIxrc1buLeLLr9nJxtPhjHSYFVaceqsXiFamWiVWzYI=nodejs AES256 шифрует отличаются от онлайн AES256 инструмента шифрования

Сыворотка они разные?

+0

Я не эксперт, но я думаю, что это связано с вектором инициализации. – noisypixy

ответ

4

Во-первых, «яблоко» не может быть ключом для AES-256. Этого недостаточно. Ключ AES-256 должен быть ровно 256 бит (32 байта). «Яблоко», по вероятным способам его кодирования, 5. Таким образом, проблема здесь уже существует. Системы могут быть дополнены нулями для вас, но вы не можете положиться на это. Это не то, что ключи AES должны выглядеть так или иначе; они должны быть 32 «эффективно случайными» байтами; «яблоко» не «эффективно случайное».

Пакет nodejs указывает, что он генерирует случайный IV. Это, вероятно, означает, что она также кодирует случайную IV на выходе и ожидает его на входе, и достаточно уверен, что это то, что мы видим в коде:

ciphertext = Buffer.concat([iv, ciphertext, cipher.final()]); 

Если предположить, что исходный код ниже страницы PHP на самом деле связано инструмент, то они назвали это:

$this->setIV(""); 

, который, вероятно, где-то транслирует в 16 байт нулей (что является очень небезопасным IV).

Более короткий ответ заключается в том, что нет абсолютно никакого стандарта для применения AES или кодирования вывода. Подавляющее большинство реализаций, которые вы найдете (включая эти два), очень небезопасны, потому что они предполагают, что вы знаете, как добавить все части, которые они не хватает. Например, для обеих этих реализаций нужен HMAC, поскольку они использовали режим CBC, но ни один из них не включает один, и если вы хотите передать строку, такую ​​как «apple» в качестве пароля, вам нужна функция деривации ключа, такая как PBKDF2, чтобы преобразовать ее в ключ. (Так вы превращаете строку типа «яблоко» во что-то «эффективно случайное»). Любая безопасная реализация будет несовместима с любой другой безопасной реализацией. Там просто нет широко используемого стандартного формата, который также безопасен.

Все, что сказано, защищенный формат должен всегда приводить к двум разным шифровым текстам. Пакет nodejs делает это правильно, включив случайный IV, и если вы запустили его несколько раз, вы получите разные результаты. Это функция, которая предотвращает определенные виды атак. Поэтому разные результаты не должны удивлять.

Если вы ищете готовый формат AES, который включает в себя все необходимые вам фрагменты, взгляните на RNCryptor или libsodium.