2012-01-17 4 views
4

У меня есть текст, закодированный с помощью Blowfish Mcrypt РНР:Дешифровка Mcrypt закодированный текст с node.js

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

При попытке расшифровать данные с криптографической библиотекой узла я получаю кучу мусора.

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

Любая идея относительно того, что я делаю неправильно?

EDIT

Использование OpenSSL (который крипто библиотека является оболочкой для) непосредственно дает тот же искаженный результат:

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

Так это не выглядит как проблема с Код Javascript.

ответ

0

Я не уверен, если есть какие-либо другие ошибки, но при использовании IV следует использовать метод createDecipheriv:

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

+0

Вы правы, это была ошибка при копировании кода. Исправлен вопрос. – aviaron

+0

Поскольку зашифрованный текст имеет кодировку base64, я думаю, что вы должны сделать: 'res = c.update (cipherText," base64 ", 'utf8');' –

+0

'cipherText' является' Буфером' и интерпретируется как бинарная закодированная строка при передаче в 'update'. – aviaron

0

Вы используете ivAndCiphertext = "base64-encoded-ciphertext" следовали непосредственно ivAndCiphertext = new Buffer(ivAndCiphertext, 'base64');. Ваша переменная будет указывать на новый буфер, поэтому вы получите результат дешифрования нового буфера.

3

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

Encrypt:

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

этот модуль больше не работает или не поддерживается. –

Смежные вопросы