Ваш код фактически использует разные параметры шифрования в 2 случаях. AES, являясь блочным шифром, принимает: простой текст для шифрования, вектор инициализации, также называемый IV (который используется вместе с открытым текстом), и ключ шифрования.
В Java, IV, по-видимому, генерируется автоматически в init () - из документации Java SE для Cipher.init:
Сгенерированные параметры можно получить с помощью getParameters или getIV. (если параметром является IV).
В Node.js, если используется устаревшая функция createCipher , IV генерируется автоматически на основе предоставленного ключа, вероятно, в иначе, чем в Java, поэтому вы получите другой зашифрованный текст. Тем не менее, вы должны использовать не устаревший вариант crypto.createCipheriv : https://nodejs.org/docs/latest-v12.x/api/crypto.html#crypto_crypto_createcipheriv_algorithm_key_iv_options
Чтобы точно воспроизвести зашифрованный текст, вы должны:
- Используйте один и тот же алгоритм шифрования с обеих сторон - лучше указать это точно, например, aes-256-cb c, или аутентифицированную схему шифрования, такую как aes-256-gcm , который сложнее в использовании, но обеспечивает аутентификацию сообщений.
- Используйте один и тот же IV с обеих сторон, предоставив его в параметрах инициализации в Java и с помощью createCipheriv в узле; хотя будьте осторожны, вы всегда должны рандомизировать его в производстве! См. { ссылка }
В качестве заключительного замечания, при использовании блочного шифрования вы, как правило, будете генерировать безопасные случайные IV, что означает, что шифротексты всегда будут отличаться друг от друга даже за тот же открытый текст. Это хорошая вещь! Он защищает ваши данные от злоумышленника, который наблюдает зашифрованные данные и делает выводы на основе повторений сообщений.