Я могу использовать node.js криптографический модуль для шифрования и дешифрования сообщения с использованием классов Cipher и Decipher с алгоритмом «aes-256-cb c», например:
var crypto = require('crypto');
var cipherKey = crypto.randomBytes(32); // aes-256 => key length is 256 bits => 32 bytes
var cipherIV = crypto.randomBytes(16); // aes block size = initialization vector size = 128 bits => 16 bytes
var cipher = crypto.createCipheriv('aes-256-cbc', cipherKey, cipherIV);
var message = 'Hello world';
var encrypted = cipher.update(message, 'utf8', 'hex') + cipher.final('hex');
console.log('Encrypted \'' + message + '\' as \'' + encrypted + '\' with key \''+ cipherKey.toString('hex') + '\' and IV \'' + cipherIV.toString('hex') + '\'');
// Outputs: Encrypted 'Hello world' as '2b8559ce4227c3c3c200ea126cb50957' with key '50f7a656cfa3c4f90796a972b2f6eedf41b589da705fdec95b9d25c180c16cf0' and IV '6b28c13d63af14cf05059a2a2caf370c'
var decipher = crypto.createDecipheriv('aes-256-cbc', cipherKey, cipherIV);
var decrypted = decipher.update(encrypted, 'hex', 'utf8') + decipher.final('utf8');
console.log('Decrypted \'' + encrypted + '\' as \'' + decrypted + '\' with key \''+ cipherKey.toString('hex') + '\' and IV \'' + cipherIV.toString('hex') + '\'');
// Outputs: Decrypted '2b8559ce4227c3c3c200ea126cb50957' as 'Hello world' with key '50f7a656cfa3c4f90796a972b2f6eedf41b589da705fdec95b9d25c180c16cf0' and IV '6b28c13d63af14cf05059a2a2caf370c'
Однако Когда я пытаюсь расшифровать сообщение, используя неправильный ключ, чтобы, возможно, наивно, продемонстрировать, что злоумышленник не сможет расшифровать сообщение, пока ключ не известен, я получаю Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt at Decipheriv.final (internal/crypto/cipher.js:164:28)
:
var differentCipherKey = crypto.randomBytes(32);
var decipherDifferentKey = crypto.createDecipheriv('aes-256-cbc', differentCipherKey, cipherIV);
decrypted = decipherDifferentKey.update(encrypted, 'hex', 'utf8') + decipherDifferentKey.final('utf8');
Кем я был надеялся получить непонятный текст. bad decrypt
был включен в другие вопросы SO, касающиеся либо несоответствия версий openssl между шифрованием и дешифрованием, либо слишком короткого вектора инициализации в том же случае, но я считаю, что мой случай - другой сценарий. Известно ли AES, что зашифрованный текст был сгенерирован с другим ключом?
Протестировано на узле v12.13.0 на Windows 10, а также в repl.it под управлением v10.16.0.
РЕДАКТИРОВАТЬ: Как указывалось в ответах, проблема заключалась в заполнении по умолчанию, чтобы увидеть неразборчивый вывод, необходимо отключить автоматическое заполнение как для шифров, так и для дешифровщиков и для заполнения вручную:
var requirePadding = 16 - Buffer.byteLength(message, 'utf8');
var paddedMessage = Buffer.alloc(requirePadding, 0).toString('utf8') + message;
cipher.setAutoPadding(false)
Полный пример здесь