Я успешно использую NodeJS для шифрования файла следующим образом:
let cipher = crypto.createCipheriv('aes-128-cbc', key, iv),
crypted = cipher.update(file_data, 'binary');
return Buffer.concat([crypted, cipher.final()]);
Это создает файл с хешем, который точно соответствует нашему целевому шифрованию, то есть команде OpenSSL на стороне сервера:
openssl aes-128-cbc -e -in file -out file.enc -nosalt -iv <iv_str> -K <k_str>
Цель - обновить наши системы для использования потоков nodejs.Документация узла и другие публикации предлагают следующий способ шифрования потоков:
cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
let file_stream = fs.createReadStream(local_file, 'binary'),
write_stream = fs.createWriteStream(`${local_file}.enc`, 'binary');
file_stream.pipe(cipher).pipe(write_stream);
, однако при этом игнорируется добавление cipher.final()
.Без этого шифрование всегда приводит к файлу с неправильным хешем.Я пытался:
- создать
Transform
, который бы добавил оставшиеся отступы.Это не сработает, потому что вы не можете вызвать final
на шифре, на который не было вызвано update
- , установив автозаполнение с помощью
setAutoPadding
.Во всех случаях это приводит к ошибке Error: error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length
Как я могу зашифровать с потоками так же, как я изначально шифровал?