#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')); });