Node.js - 文件加密和解密

4
我希望在客户端加密文件并将其发送到服务器端进行解密,但在使用内置的crypto(node js)时出现错误。

client.js

const crypto = require('crypto');
const cipher = crypto.createCipher('aes192', 'a password');
const encInput = fs.createReadStream("abc.txt");
const encOutput = fs.createWriteStream("abc.txt.enc");

       encInput.pipe(cipher).pipe(encOutput).on('close', function() {
         // DATA SENT TO SERVER SIDE
         //USING PIPELINE TO SEND DATA TO SERVER
       });

这部分已经完美地完成了任务,它在客户端创建了一个加密文件并将其发送到服务器端。

Server.js

//接收数据

//在这一端接收到文件后,我运行解密脚本

const crypto = require('crypto');
const decipher = crypto.createDecipher('aes192', 'a password');

const decInput = fs.createReadStream("abc.txt.enc");
const decOutput = fs.createWriteStream("abc.txt");
decInput.pipe(decipher).pipe(decOutput);

这会导致一个错误

Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
    at Decipher._flush (internal/crypto/cipher.js:141:28)
    at Decipher.prefinish (_stream_transform.js:141:10)
    at Decipher.emit (events.js:182:13)
    at prefinish (_stream_writable.js:630:14)
    at finishMaybe (_stream_writable.js:638:5)
    at afterWrite (_stream_writable.js:481:3)
    at onwrite (_stream_writable.js:471:7)
    at Decipher.afterTransform (_stream_transform.js:94:3)
    at Decipher._transform (internal/crypto/cipher.js:136:3)
    at Decipher.Transform._read (_stream_transform.js:190:10)
    Emitted 'error' event at:
    at Decipher.onerror (_stream_readable.js:687:12)
    at Decipher.emit (events.js:182:13)
    at done (_stream_transform.js:208:19)
    at _flush (_stream_transform.js:142:7)
    at Decipher._flush (internal/crypto/cipher.js:143:5)
    at Decipher.prefinish (_stream_transform.js:141:10)
    [... lines matching original stack trace ...]
    at afterWrite (_stream_writable.js:481:3)

我知道客户端没有问题,使用管道套接字完美地发送数据。 在服务器端也没有接收数据的问题,只有解密出现问题,我不知道为什么。 如果你需要了解我代码方面的其他信息,请告诉我。 使用 Node v10.6.0。

在上传后,比较客户端和服务器上的 abc.txt.enc 文件。它们是否相同?这两个文件使用相同的编码吗? - Lemix
@Lemix 是的,两者是相同的...我现在看到的是在服务器端它完美地解密了文件,但之后却出现了这个错误... - Neeraj Walia
现在我发现的是,当我使用相同的代码解密客户端生成的文件时,它运行良好,但如果我使用相同的代码解密服务器端接收到的文件,则会出现此错误。 - Neeraj Walia
尝试使用初始化向量(createCipherivcreateDecipheriv方法)。示例在我的回答中。 - Lemix
我重现了一个类似的错误。我只能通过使用base64编码来解决它。 - Lemix
1个回答

0

尝试使用初始化向量和base64文件存储格式:

const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const base64 = require('base64-stream');
const iv = new Buffer('1065faf25ac8560968c58ce6dc0ae36f', 'hex'); // 16 byte iv
const kk = new Buffer('84521db468d282c4ce21cdde65e508ce3d1924d1be5c4754', 'hex'); // 24 byte key (192 bits)
const cipher = crypto.createCipheriv('aes192', kk, iv, { encoding: 'base64' });
const encInput = fs.createReadStream(path.join(__dirname, "abc.txt"));
const encOutput = fs.createWriteStream(path.join(__dirname, "abc.txt.enc"));

encInput.pipe(cipher).pipe(encOutput).on('close', function () {
    const decipher = crypto.createDecipheriv('aes192', kk, iv);
    const decInput = fs.createReadStream(path.join(__dirname, "abc.txt.enc"));
    const decOutput = fs.createWriteStream(path.join(__dirname, "abc.txt.dec"));
    decInput.pipe(base64.decode()).pipe(decipher).pipe(decOutput);
});

仍然是同样的错误...我上面发布的代码在解码我发送到服务器端的文件时出现问题,如果我在同一侧进行加密和解密,则不会出现任何错误,但是当我在客户端对文件进行加密并将其发送到服务器并在服务器端对其进行解密时,它会产生错误...尽管它解密文件并且它运行良好,但是给我带来了退出服务器文件的错误,我无法继续进行更多的操作...我尝试了你的方法,但是仍然存在相同的问题...感谢你的努力。 - Neeraj Walia
@NeerajWalia 在我的例子中,如果我在加密时使用 encode: utf8,我会得到你的错误。因此,使用指定的编码创建的文件与未指定编码的文件相同,但会出现错误。也许这些信息会有所帮助。 - Lemix
当我完全使用您的代码时,它可以正常工作,但您在同一文件(比如client.js)中进行编码和解码处理。然而,我想通过流、管道和套接字将文件从客户端发送到服务器,因此我需要在客户端进行编码,在服务器端进行解码。 - Neeraj Walia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接