Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js and crypto library

I'm having weird issues with Node's crypto library. I wrote this simple AES testing script:

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8')
var text = "123|123123123123123";
cipher.update(text,'utf8','hex')
var crypted = cipher.final('hex')
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8')
decipher.update(crypted,'hex','utf8')
var dec = decipher.final('utf8')

When I do console.log(dec), it's null. For some reason if I set test to "123|123123", it works. So why does "123|123123" work but "123|123123123123123" doesn't?

like image 857
Mike Avatar asked Dec 21 '10 07:12

Mike


1 Answers

You need to store the return from cipher.update as well as cipher.final to be sure you have everything.

cipher.update "returns the enciphered contents, and can be called many times with new data as it is streamed":

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final "returns any remaining enciphered contents".

I think you just append the results with each call like this:

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8');
var text = "123|123123123123123";
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8');
var dec = decipher.update(crypted,'hex','utf8');
dec += decipher.final('utf8');

I get '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585' for crypted and '123|123123123123123' for dec in the above with node v0.2.5

like image 179
RandomEtc Avatar answered Sep 29 '22 11:09

RandomEtc