在 Node.JS 加密 (aes-256-cbc) 中加密,然后在 OpenSSL CLI 中解密
Encrypt in Node.JS Crypto (aes-256-cbc) then decrypt in OpenSSL CLI
我正在 Node.js 中加密文件,并尝试使用 OpenSSL 命令行解密。我是一位经验丰富的开发人员,但我并没有完全接受过加密方面的教育。我基本上只需要一种以编程方式加密文件的好方法,并且能够在以后使用命令行对其进行解密。
Node.JS代码:
const crypto = require('crypto');
const fs = require('fs');
const { pipeline } = require('stream');
const algorithm = 'aes-256-cbc';
const password = 'ABC123';
crypto.scrypt(password, 'salt', 32, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream('test.txt');
const output = fs.createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
我的 CLI 命令:
openssl enc -aes-256-cbc -nosalt -d -in test.enc -out test2.txt
这给了我:
bad decrypt
我相信bad decrypt
意味着openssl不理解加密密钥
事情是这样的。
- 第一步
crypto
使用提供的密码和盐生成加密密钥:
crypto.scrypt(password, 'salt', 32,...
- 作为第二步,它生成一个初始化向量 (iv):
crypto.randomFill(new Uint8Array(16)
- 最后它使用生成的密钥和 iv 创建密码并实际加密文件:
pipeline(input, cipher, output,
因此,要使用 openssl 解密此文件,需要同时提供密钥和 iv。
这是解密它的一种方法。查看底部添加的生成 openssl decrypt 命令的代码:
const crypto = require('crypto');
const fs = require('fs');
const { pipeline } = require('stream');
const algorithm = 'aes-256-cbc';
const password = 'ABC123';
crypto.scrypt(password, 'salt', 32, {}, (err, key) => {
if (err) {
throw err;
}
// Then, we'll generate a random initialization vector
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) {
throw err;
}
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream('test.txt');
const output = fs.createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) {
throw err;
}
});
// Generate openssl decrypt command
const hexKey = key.toString('hex');
const hexIv = Buffer.from(iv).toString('hex');
console.log(`openssl enc -aes-256-cbc -d -in test.enc -out test2.txt -K ${hexKey} -iv ${hexIv}`);
});
});
我正在 Node.js 中加密文件,并尝试使用 OpenSSL 命令行解密。我是一位经验丰富的开发人员,但我并没有完全接受过加密方面的教育。我基本上只需要一种以编程方式加密文件的好方法,并且能够在以后使用命令行对其进行解密。
Node.JS代码:
const crypto = require('crypto');
const fs = require('fs');
const { pipeline } = require('stream');
const algorithm = 'aes-256-cbc';
const password = 'ABC123';
crypto.scrypt(password, 'salt', 32, (err, key) => {
if (err) throw err;
// Then, we'll generate a random initialization vector
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) throw err;
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream('test.txt');
const output = fs.createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) throw err;
});
});
});
我的 CLI 命令:
openssl enc -aes-256-cbc -nosalt -d -in test.enc -out test2.txt
这给了我:
bad decrypt
我相信bad decrypt
意味着openssl不理解加密密钥
事情是这样的。
- 第一步
crypto
使用提供的密码和盐生成加密密钥:crypto.scrypt(password, 'salt', 32,...
- 作为第二步,它生成一个初始化向量 (iv):
crypto.randomFill(new Uint8Array(16)
- 最后它使用生成的密钥和 iv 创建密码并实际加密文件:
pipeline(input, cipher, output,
因此,要使用 openssl 解密此文件,需要同时提供密钥和 iv。
这是解密它的一种方法。查看底部添加的生成 openssl decrypt 命令的代码:
const crypto = require('crypto');
const fs = require('fs');
const { pipeline } = require('stream');
const algorithm = 'aes-256-cbc';
const password = 'ABC123';
crypto.scrypt(password, 'salt', 32, {}, (err, key) => {
if (err) {
throw err;
}
// Then, we'll generate a random initialization vector
crypto.randomFill(new Uint8Array(16), (err, iv) => {
if (err) {
throw err;
}
const cipher = crypto.createCipheriv(algorithm, key, iv);
const input = fs.createReadStream('test.txt');
const output = fs.createWriteStream('test.enc');
pipeline(input, cipher, output, (err) => {
if (err) {
throw err;
}
});
// Generate openssl decrypt command
const hexKey = key.toString('hex');
const hexIv = Buffer.from(iv).toString('hex');
console.log(`openssl enc -aes-256-cbc -d -in test.enc -out test2.txt -K ${hexKey} -iv ${hexIv}`);
});
});