Decrypt mcrypt encoded text using node.js

I have text encoded using Blowfish using PHP mcrypt:

$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); 

When I try to decode data using the Node crypto library, I get garbage output.

 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'); 

Any idea on what I'm doing wrong?

EDIT

Using openssl (which the crypto library is a wrapper for) directly gives the same distorted result:

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

So this is not like a problem with Javascript code.

+4
source share
3 answers

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')); 

Decrypt:

 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()); 
+3
source

I'm not sure if there are other errors, but when using IV you should use the createDecipheriv method:

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

0
source

You use ivAndCiphertext = "base64-encoded-ciphertext" , followed by ivAndCiphertext = new Buffer(ivAndCiphertext, 'base64'); . Your variable will point to the new buffer, so you get the result of decrypting the new buffer.

0
source

Source: https://habr.com/ru/post/1391450/


All Articles