title: Getting error "wrong final block length" when decrypting AES256 cipher
body: <p>I'm facing exactly the same problem mentioned in <a href="https://stackoverflow.com/questions/21292142/decyrpting-aes256-with-node-js-returns-wrong-final-block-length">this thread</a> while encrypting and decrypting using AES.</p>
  
  <blockquote>
    <p>crypto.js:202<br>
    var ret = this._handle.final();
                                ^
    Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong  final block length<br>
    at Error (native)<br>
    at Decipher.Cipher.final (crypto.js:202:26)  </p>
  </blockquote>
  
  <p>These are my encrypt and decrypt functions:</p>
  
  <pre><code>var config = {
  cryptkey: crypto.createHash('sha256').update('Nixnogen').digest(),
  iv: "a2xhcgAAAAAAAAAA"
  };
  
  function encryptText(text){
      console.log(config.cryptkey);
          var cipher = crypto.createCipheriv('aes-256-cbc', config.cryptkey, config.iv);
          var crypted = cipher.update(text,'utf8','binary');
          crypted += cipher.final('binary');
      crypted = new Buffer(crypted, 'binary').toString('base64');
          return crypted;
  }
  
  function decryptText(text){
      console.log(config.cryptkey);
          if (text === null || typeof text === 'undefined' || text === '') {return text;};
      text = new Buffer(text, 'base64').toString('binary');
          var decipher = crypto.createDecipheriv('aes-256-cbc', config.cryptkey, config.iv);
          var dec = decipher.update(text,'binary','utf8');
          dec += decipher.final('utf8');
          return dec;
  }
  </code></pre>
  
  <p>I've set <code>"node": "&gt;=0.10.0"</code> in my <code>package.json</code>.</p>
  
  <p>Can anyone tell me how to fix it? I have tried solutions mentioned in the thread but none of them are working for me.</p>
  
  <p><strong>Updates:</strong></p>
  
  <p>I've tried solutions mentioned in the thread but none of them are working for me. I think there might be a different solution for this and hence, rather than polluting the existing thread, decided to create a new one. Also, if I continue this on the existing thread it might confuse future candidates for the right solution.</p>
  
  <p><strong>Update 2:</strong></p>
  
  <p>For the second solution mentioned in the thread, I have the following code, but it is also giving me the same error:</p>
  
  <pre><code>function encryptText(text){
      console.log(config.cryptkey);
          var cipher = crypto.createCipheriv('aes-256-cbc', config.cryptkey, config.iv);
      return Buffer.concat([
          cipher.update(text),
          cipher.final()
      ]);
  }
  
  function decryptText(text){
      console.log(config.cryptkey);
          if (text === null || typeof text === 'undefined' || text === '') {return text;};
          var decipher = crypto.createDecipheriv('aes-256-cbc', config.cryptkey, config.iv);
      return Buffer.concat([
          decipher.update(text),
          decipher.final()
      ]);
  }
  </code></pre>
  
  <p>Also, I'm using these functions as getters and setters for a field in my mongodb database using mongoose. I don't think doing so will cause any issues, but I still thought it would be a good idea to mention this.</p>
  
  <p><strong>Update 3:</strong> </p>
  
  <p>I'm trying to encrypt a Facebook access token and decrypt an encrypted Facebook access token.</p>
  
  <p>To reproduce the error, you can try encrypting this token: </p>
  
  <blockquote>
    <p>ASDFGHJKLO0cBACJDJoc25hkZAzcOfxhTBVpHRva4hnflYEwAHshZCi2qMihYXpS2fIDGsqAcAlfHLLo273OWImZAfo9TMYZCbuZABJkzPoo4HZA8HRJVCRACe6IunmBSMAEgGVv8KCLKIbL6Gf7HJy9PplEni2iJ06VoZBv0fKXUvkp1k7gWYMva1ZAyBsWiDiKChjq3Yh1ZCdWWEDRFGTHYJ</p>
  </blockquote>
  
  <p>Encryption will work fine and you will get an encrypted string. </p>
  
  <p>Now try decrypting the encrypted string which you got in the previous step. You will get the error.</p>