Node.js ошибка файла расшифровки канала: Неподдерживаемое состояние или невозможность проверки подлинности данных

#node.js #encryption #cryptography #aes #nodejs-stream

#node.js #шифрование #криптография #aes #nodejs-поток

Вопрос:

Я пытаюсь зашифровать/расшифровать файл в потоке с помощью каналов. Шифрование работает, однако при расшифровке я получаю ошибку:

Ошибка: Неподдерживаемое состояние или невозможность аутентификации данных
при расшифровке._flush (узел:внутренний/крипто/шифр:160:29) в Decipheriv.final [как _final] (узел:внутренний/потоки/преобразование:112:25) в callFinal (узел:внутренний/потоки/для записи:694:27) в предварительном (узел:внутренний/потоки/для записи:719:7) в finishMaybe (узел:внутренний/потоки/для записи:729:5) в Decipheriv.Для записи.конец (узел:внутренний/потоки/для записи:631:5) в IOStream.onend (узел:внутренний/потоки/читаемый:693:10) в Object.onceWrapper (узел:события:509:28) в IOStream.излучать (узел:события:402:35) в endReadableNT (узел:внутренний/потоков/чтения:1343:12) излучаемый ‘ошибка’ событие на Decipheriv экземпляра: на Decipheriv.число (узел:внутренний/потоков/чтения:773:14) в Decipheriv.излучать (узел:события:390:28) в emitErrorNT (узел:внутренний/потоков/уничтожить:157:8) в emitErrorCloseNT (узел:внутренний/потоков/уничтожить:122:3) в processTicksAndRejections (узел:внутренние/процесс/task_queues:83:21)

Код (последняя строка выдает ошибку):

 const crypto = require('crypto'); const fs = require('fs');  const secret = crypto.randomBytes(32);  const iv = crypto.randomBytes(16);  const cipher = crypto.createCipheriv('aes-256-gcm', secret, iv); const decipher = crypto.createDecipheriv('aes-256-gcm', secret, iv);  fs.createReadStream('data.txt').pipe(cipher). pipe(fs.createWriteStream('encrypted.txt'));  fs.createReadStream('encrypted.txt').pipe(decipher). pipe(fs.createWriteStream('decrypted.txt'));  

Комментарии:

1. Потому что вы начинаете расшифровку encrypted.txt до data.txt завершения шифрования.

2. Как мне убедиться, что файл зашифрован, прежде чем я начну его расшифровывать?

Ответ №1:

Это работает так, ожидая, пока он закончит чтение/шифрование, прежде чем начать запись/шифрование.

 const crypto = require('crypto'); const fs = require('fs');  const secret = crypto.randomBytes(32); const iv = crypto.randomBytes(16);  const cipher = crypto.createCipheriv('aes-256-gcm', secret, iv); const decipher = crypto.createDecipheriv('aes-256-gcm', secret, iv);  fs.createReadStream('data.txt').pipe(cipher)  .pipe(fs.createWriteStream('encrypted.txt'))  .on('end', () =gt; {  fs.createReadStream('encrypted.txt')  .pipe(decipher)  .pipe(fs.createWriteStream('decrypted.txt')); });