使用node.js解密mcrypt编码的文本

我使用PHP的mcrypt编码了Blowfish的文本:

$td = mcrypt_module_open ('blowfish', '', 'cfb', ''); $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MCRYPT_RAND); mcrypt_generic_init ($td, "somekey", $iv); $crypttext = mcrypt_generic ($td, "sometext"); mcrypt_generic_deinit ($td); $res = base64_encode($iv.$crypttext); 

当试图用Node的encryption库解码数据时,我得到垃圾输出。

 var crypto = require("crypto"), ivAndCiphertext = "base64-encoded-ciphertext", iv, cipherText, ivSize = 8, res= ""; ivAndCiphertext = new Buffer(ivAndCiphertext, 'base64'); iv = new Buffer(ivSize); cipherText = new Buffer(ivAndCiphertext.length - ivSize); ivAndCiphertext.copy(iv, 0, 0, ivSize); ivAndCiphertext.copy(cipherText, 0, ivSize); c = crypto.createDecipheriv('bf-cfb', "somekey", iv.toString("binary")); res = c.update(cipherText, "binary", 'utf8'); res += c.final('utf8'); 

任何想法,我在做什么错了?

编辑

使用openssl(encryption库是一个包装)直接给出相同的乱码结果:

openssl enc -K the_key_in_hex bf-cfb -d -p -iv the_iv_in_hex -nosalt -nopad -a

所以它看起来不像Javascript代码的问题。

https://github.com/tugrul/node-mcrypt

encryption:

 var mcrypt = require('mcrypt'); var bfEcb = new mcrypt.MCrypt('blowfish', 'cfb'); var iv = bfEcb.generateIv(); bfEcb.open('somekey', iv); var cipherText = bfEcb.encrypt('sometext'); console.log(Buffer.concat([iv, cipherText]).toString('base64')); 

解密:

 var mcrypt = require('mcrypt'); var bfEcb = new mcrypt.MCrypt('blowfish', 'cfb'); var ivAndCiphertext = new Buffer('AyvfjTyg24Y9fVCdjzRPEw==', 'base64'); var ivSize = bfEcb.getIvSize(); var iv = new Buffer(ivSize); var cipherText = new Buffer(ivAndCiphertext.length - ivSize); ivAndCiphertext.copy(iv, 0, 0, ivSize); ivAndCiphertext.copy(cipherText, 0, ivSize); bfEcb.open('somekey', iv); console.log(bfEcb.decrypt(cipherText).toString()); 

我不确定是否还有其他错误,但在使用IV时,应使用createDecipheriv方法:

http://nodejs.org/docs/latest/api/crypto.html#crypto.createDecipheriv

您正在使用ivAndCiphertext = "base64-encoded-ciphertext"紧接着是ivAndCiphertext = new Buffer(ivAndCiphertext, 'base64'); 。 你的variables将指向新的缓冲区,所以你会得到解密新缓冲区的结果。