与openssl相比,nodejs中的三重DES

时间:2016-09-16 13:31:57

标签: node.js encryption

以下示例中的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

在node.js中

但我使用以下加密:

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

为什么这些不相等?

1 个答案:

答案 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,并且避免向控制台打印警告。