За исключением аспектов безопасности (как было указано, DES и ECB, а также отсутствие ключа не является небезопасным), вы используете устаревшую crypto.createCipher()
функцию, которую получает ключ из предоставленного пароля.
Реализация crypto.createCipher()
позволяет получить ключи, используя функцию OpenSSL EVP_BytesToKey
с алгоритмом дайджеста, установленным на MD5, одна итерацияи без соли .Отсутствие соли допускает атаки по словарю, так как один и тот же пароль всегда создает один и тот же ключ.Низкое число итераций и некриптографически безопасный алгоритм хеширования позволяют очень быстро проверять пароли.
Вместо этого используйте crypto.createCipheriv()
, который использует предоставленный ключ как есть:
const crypto = require('crypto')
let enterJS = 'h';
let enterStr = null;
function encrypt(plaintext, algorithm) {
var keyStr = "imtestKey";
var key = Buffer.alloc(8, keyStr);
var cipher = crypto.createCipheriv(algorithm, key, Buffer.alloc(0));
cipher.setAutoPadding(true);
var ciph = cipher.update(Buffer.from(plaintext));
var ciphf = cipher.final();
return Buffer.concat([ciph, ciphf]).toString('hex');
}
enterStr = encrypt(enterJS, 'des-ecb').toUpperCase();
console.log("===============>>>> ENTER STR : " + enterStr);
API createCipheriv
отклонит ваш 9-байтовый длинный ключ, потому что DES требует 8-байтовый ключ.Я сделал обходной путь, чтобы взять первые 8 байтов из предоставленного пароля в качестве ключа, и теперь он печатает желаемый результат.
Вывод:
===============>>>> ENTER STR : 832E52EBD3FB9059