xxd -p
的 拳头在十六进制的末尾添加“0a”。不知道为什么,这就是为什么你注意到我在openssl加密中使用了第一个参数$1
,我已经手动生成了十六进制并插入它。
#!/bin/bash
KEY=`echo $1 |xxd -p`;
openssl enc -e -des-ede -nosalt -K $1 -iv "0000000000000000" -in $2 -out $3;
如此称呼:
sh encrypt.sh 583645585458304c4f39524756514456 settings.conf settings.enc
但我使用以下加密:
const key = Buffer.from('X6EXTX0LO9RGVQDV');
module.exports = (file, callback) =>
{
const
iv = new Buffer(0),
cipher = require('crypto').createCipheriv('des-ede', key, iv);
callback(null, cipher.update(file, 'utf8', 'binary'));
}
...并按原样触发:
require('fs').readFile(__dirname + '/settings.enc', (error, enc) =>
require('fs').readFile(__dirname + '/settings.conf', (error, conf) =>
require('./file-encrypt')(conf, (error, enc2) =>
{
enc2 = Buffer.from(enc2, 'binary');
console.log('compare: ', Buffer.compare(enc, enc2));
})));
但是输出永远不会是“0”(意思是,它们永远不会相同 - 经过测试:console.log('compare: ', Buffer.compare(enc2, enc2))
ofc记录一个漂亮的0
)
为什么这些不相等?
答案 0 :(得分:1)
在完成提供所有纯文本数据后,您错过了对cipher.final()
的调用以获取任何剩余字节。试试这个:
const crypto = require('crypto');
const key = Buffer.from('X6EXTX0LO9RGVQDV');
module.exports = (file, callback) =>
{
const iv = Buffer.alloc(0);
const cipher = crypto.createCipheriv('des-ede', key, iv);
callback(null, Buffer.concat([
cipher.update(file),
cipher.final()
]);
}
并使用如:
require('fs').readFile(__dirname + '/settings.enc', (error, enc) =>
require('fs').readFile(__dirname + '/settings.conf', (error, conf) =>
require('./file-encrypt')(conf, (error, enc2) =>
{
console.log('compare: ', Buffer.compare(enc, enc2));
})));
此外,您可以省略-iv "0000000000000000"
命令行中的openssl
,因为des-ede
未使用IV,并且避免向控制台打印警告。