0

Im using the following sample. The problem I have is when decrypting:

var decrypted = decipher.update(edata, 'binary') + decipher.final('binary');

gets an error digital envelope routines:EVD_DecryptFinal_ex:wrong final block length. Ive searched but cant seem to figure it out. Im only referring to the node.js encrypt/decrypt code:

function AES()
{
}

AES.prototype.encrypt256 = function(input, password, callback)
{
   var m = crypto.createHash('md5');
    m.update(password)
    var key = m.digest('hex');

    m = crypto.createHash('md5');
    m.update(password + key)
    var iv = m.digest('hex');

    var data = new Buffer(input, 'utf8').toString('binary');

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv.slice(0,16));
    var encrypted = cipher.update(data, 'binary') + cipher.final('binary');
    var encoded = new Buffer(encrypted, 'binary').toString('base64');
    callback(encoded);
}

AES.prototype.decrypt256 = function(input, password, callback)
{
    // Convert urlsafe base64 to normal base64
    var input = input.replace(/\-/g, '+').replace(/_/g, '/');
    // Convert from base64 to binary string
    var edata = new Buffer(input, 'base64').toString('binary')

    // Create key from password
    var m = crypto.createHash('md5');
    m.update(password)
    var key = m.digest('hex');

    // Create iv from password and key
    m = crypto.createHash('md5');
    m.update(password + key)
    var iv = m.digest('hex');

    // Decipher encrypted data
    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv.slice(0,16));
    var decrypted = decipher.update(edata, 'binary') + decipher.final('binary');
    var plaintext = new Buffer(decrypted, 'binary').toString('utf8');

    callback(plaintext);
}


var data = "This is some test that I will use to remove";
var password = "test";
var aes = new AES();
aes.encrypt256(data, password, function(encrypted_data)
{
    console.log("Encrypted=> " + encrypted_data);

    aes.decrypt256(encrypted_data, password, function(decrypted_data)
    {
        console.log("Decrypted=> " + decrypted_data);
    });
});

Any help with be great.

Community
  • 1
  • 1
adviner
  • 3,295
  • 10
  • 35
  • 64

2 Answers2

1

I was able to get it working. Here is the code in case anyone is interested:

var crypto = require("crypto");
function encrypt(text, password){

   var m = crypto.createHash('md5');
    m.update(password)
    var key = m.digest('hex');
    m = crypto.createHash('md5');
    m.update(password + key)
    var iv = m.digest('hex');

    var data = new Buffer(text, 'utf8').toString('binary');

    var cipher = crypto.createCipher('aes-256-cbc', key, iv.slice(0,16));

    var encrypted = cipher.update(data,'utf8','hex');
    encrypted += cipher.final('hex');
    var crypted = new Buffer(encrypted, 'binary').toString('base64');

  return crypted;
}

function decrypt(text, password){

    var m = crypto.createHash('md5');
    m.update(password)
    var key = m.digest('hex');
    // Create iv from password and key
    m = crypto.createHash('md5');
    m.update(password + key)
    var iv = m.digest('hex');
  var input = text.replace(/\-/g, '+').replace(/_/g, '/');
  var edata = new Buffer(input, 'base64').toString('binary');

  var decipher = crypto.createDecipher('aes-256-cbc', key, iv.slice(0,16));

    var decrypted = decipher.update(edata,'hex','utf8');
    decrypted += decipher.final('utf8');
    var dec = new Buffer(decrypted, 'binary').toString('utf8');
  return dec;
}

var pass = 'test';
var hw = encrypt("hello world the is one of the best one eight 333 43345 45654654", pass);
console.log(hw);
var dd = decrypt(hw, pass);
console.log(dd);
adviner
  • 3,295
  • 10
  • 35
  • 64
0

Sometimes it will not work but what I did was that I remove decrypted += decipher.final('utf8');

But if you it works for you try and run your code many times as possible

So don’t use decipher.final().

Just log your text in the terminal. It will work.

You can check my GitHub code. Simple way to encrypt and decrypt file. Any file format.

https://github.com/1cornerstone/File-Encryptor