2016-09-16 66 views
1

xxd -p的第一個例子在以下示例中在十六進制的末尾添加了「0a」。不知道爲什麼,這就是爲什麼你看到我用在OpenSSL加密的第一個參數$1,我已經手動生成的十六進制和插入它作爲這樣..nodejs中的三重DES與通過openssl進行比較


#!/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

在完成提供所有純文本數據後,您錯過了對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)); 
    }))); 

此外,您還可以從openssl命令行自IV不使用des-ede,避免打印到控制檯的警告省略-iv "0000000000000000"

+0

也從nodejs中刪除了iv:'createCipheriv' =>'createCipher' – superhero

+0

由於'createCipher()'*根據傳遞給它的密碼參數生成*(使用MD5)key,所以不應該改變它。既然你已經有了確切的關鍵,你應該像原來一樣使用'createCipheriv()'。 – mscdex

+0

嘿謝謝m8 :) – superhero

相關問題