title: nodejs crypto createDecipheriv throws 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH'
body: <p>I'm experimenting with encryption and decryption of mp3 files. I have a python code doing an AES encryption and trying to decrypt the encrypted output with crypto library of node.js. My python code is:</p>
  <pre><code>from Crypto.Cipher import AES
  import hashlib
  
  # code from https://eli.thegreenplace.net/2010/06/25/
  # aes-encryption-of-files-in-python-with-pycrypto
  def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024):    
      if not out_filename:
          out_filename = in_filename + '.enc'
  
      #iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16))
      iv = os.urandom(16)
      encryptor = AES.new(key, AES.MODE_CBC, iv)
      filesize = os.path.getsize(in_filename)
  
      with open(in_filename, 'rb') as infile:
          with open(out_filename, 'wb') as outfile:
              outfile.write(struct.pack('&lt;Q', filesize))
              outfile.write(iv)
  
              while True:
                  chunk = infile.read(chunksize)
                  if len(chunk) == 0:
                      break
                  elif len(chunk) % 16 != 0:
                      chunk += (' ' * (16 - len(chunk) % 16)).encode('ascii')
  
                  outfile.write(encryptor.encrypt(chunk))
  
  if __name__ == '__main__':
      password = 'helloWorld!'
      enc_key = hashlib.sha256(password.encode(encoding='utf-8',errors='strict')).digest()
      print(base64.b64encode(enc_key).decode('ascii'))
      audio_file_name = &quot;GetachewMekuryaSaxphone_IBSA8Sz.mp3&quot;
      enc_output = audio_file_name + &quot;.enc&quot;
      encrypt_file(enc_key, audio_file_name, enc_output)
  
  </code></pre>
  <p>and a javascript code for decryption:</p>
  <pre><code>var fs = require('fs');
  var crypto = require('crypto');
  var password = 'helloWorld!'
  const enc_key = crypto.createHash('sha256').update(String(password)).digest('base64').substr(0, 32);
  console.log(enc_key);
  let iv = crypto.randomBytes(16);
  var cipher = crypto.createCipheriv('aes-256-cbc', enc_key, iv);
  var decipher = crypto.createDecipheriv('aes-256-cbc',enc_key, iv);
  var input = fs.createReadStream('GetachewMekuryaSaxphone_IBSA8Sz.mp3.enc');
  var output = fs.createWriteStream('GetachewMekuryaSaxphone_IBSA8Sz_DEC.mp3');
  
  input.pipe(decipher).pipe(output);
  
  output.on('finish', function() {
    console.log('Encrypted file written to disk!');
  });
  
  </code></pre>
  <p>However, I am getting an error while attempting to decrypt with the following message:</p>
  <pre><code>events.js:292
        throw er; // Unhandled 'error' event
        ^
  
  Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
      at Decipheriv._flush (internal/crypto/cipher.js:141:29)
      at Decipheriv.prefinish (_stream_transform.js:142:10)
      at Decipheriv.emit (events.js:315:20)
      at prefinish (_stream_writable.js:619:14)
      at finishMaybe (_stream_writable.js:627:5)
      at Decipheriv.Writable.end (_stream_writable.js:571:5)
      at ReadStream.onend (_stream_readable.js:676:10)
      at Object.onceWrapper (events.js:421:28)
      at ReadStream.emit (events.js:327:22)
      at endReadableNT (_stream_readable.js:1223:12)
  Emitted 'error' event on Decipheriv instance at:
      at emitErrorNT (internal/streams/destroy.js:100:8)
      at emitErrorCloseNT (internal/streams/destroy.js:68:3)
      at processTicksAndRejections (internal/process/task_queues.js:84:21) {
    library: 'digital envelope routines',
    function: 'EVP_DecryptFinal_ex',
    reason: 'wrong final block length',
    code: 'ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH'
  }
  
  </code></pre>