Decrypting AES256 with node.js returns wrong final block length

前端 未结 3 1824
猫巷女王i
猫巷女王i 2020-11-27 06:45

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:

相关标签:
3条回答
  • 2020-11-27 07:09

    My issue was that the string I was passing to my decrypt function was empty. I built in a check for empty strings and I did not receive the message again.

    decrypt: function(text){
                    if(text.length == 0){
                        return text;
                    }
                    return this.decipher.update(text, 'hex', 'utf8') + this.decipher.final('utf8');
                }
    
    0 讨论(0)
  • 2020-11-27 07:10

    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.

    0 讨论(0)
  • 2020-11-27 07:17

    As your answer states, those functions work with Buffers now unless you specify an encoding. That said, you'd be better off avoiding binary encoded strings entirely and treat everything as Buffers until you strictly need a string for something. This way you can also use your encryption helpers to process non-text content.

    var crypto = require('crypto');
    
    var AESCrypt = {};
    
    AESCrypt.decrypt = function(cryptkey, iv, encryptdata) {
        var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv);
        return Buffer.concat([
            decipher.update(encryptdata),
            decipher.final()
        ]);
    }
    
    AESCrypt.encrypt = function(cryptkey, iv, cleardata) {
        var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv);
        return Buffer.concat([
            encipher.update(cleardata),
            encipher.final()
        ]);
    }
    
    var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(),
    iv = new Buffer('a2xhcgAAAAAAAAAA'),
    buf = new Buffer("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.toString('base64'));
    console.warn("decrypt all: " + dec.toString('utf8'));
    
    0 讨论(0)
提交回复
热议问题