Decrypting AES256 with node.js returns wrong final block length

aes, encryption, node.js, openssl

Solution

Ok, so there was a change to Crypto in the switch from 0.8 to 0.10 Crypto methods return Buffer objects by default, rather than binary-encoded strings

This means the above code needs to specify encodings.

These four lines:

decoded = decipher.update(encryptdata);
decoded += decipher.final();
encryptdata = encipher.update(cleardata);
encryptdata += encipher.final();

Are changed to:

decoded = decipher.update(encryptdata, 'binary', 'utf8');
decoded += decipher.final('utf8');
encryptdata = encipher.update(cleardata, 'utf8', 'binary');
encryptdata += encipher.final('binary');

This worked for me, but I am open to other suggestions.

Problem

Using this Gist I was able to successfully decrypt AES256 in Node.js 0.8.7. Then when I upgraded to Node.js 0.10.24, I now see this error: TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length at Decipheriv.Cipher.final (crypto.js:292:27) Here is the decrypt code from the Gist (shown here for convenience): ``` var crypto = require('crypto'); var AESCrypt = {}; AESCrypt.decrypt = function(cryptkey, iv, encryptdata) { encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), decoded = decipher.update(encryptdata); decoded += decipher.final(); return decoded; } AESCrypt.encrypt = function(cryptkey, iv, cleardata) { var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), encryptdata = encipher.update(cleardata); encryptdata += encipher.final(); encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); return encode_encryptdata; } var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(), iv = 'a2xhcgAAAAAAAAAA', buf = "Here is some data for the encrypt", // 32 chars enc = AESCrypt.encrypt(cryptkey, iv, buf); var dec = AESCrypt.decrypt(cryptkey, iv, enc); console.warn("encrypt length: ", enc.length); console.warn("encrypt in Base64:", enc); console.warn("decrypt all: " + dec); ```

Original source

Related problems