Milkncookiez
Milkncookiez

Reputation: 7377

Decryption returns empty result - nodejs crypto

function encrypt() {
  const iv = '3af545da025d5b07319cd9b2571670ca'
    , payload = '01000000000000000000000000000000'
    , key = 'c1602e4b57602e48d9a3ffc1b578d9a3';

  const cipher = crypto.createCipheriv('aes128', new Buffer(key, 'hex'), new Buffer(iv, 'hex'));
  const encryptedPayload = cipher.update(new Buffer(payload, 'hex'));

  let encryptedPayloadHex = encryptedPayload.toString('hex');
  console.log(encryptedPayloadHex); // returns 'ae47475617f38b4731e8096afa5a59b0'
};

function decrypt() {
  const iv = '3af545da025d5b07319cd9b2571670ca'
    , key = 'c1602e4b57602e48d9a3ffc1b578d9a3'
    , payload = 'ae47475617f38b4731e8096afa5a59b0';

  const decipher = crypto.createDecipheriv('aes128', new Buffer(key, 'hex'), new Buffer(iv, 'hex'));
  const decryptedPayload = decipher.update(new Buffer(payload, 'hex'), 'hex', 'hex');      

  console.log(decryptedPayload); // returns empty string
  // decipher.update(new Buffer(payload, 'hex')) // returns empty buffer

  const decryptedPayloadHex = decipher.final('hex'); // returns 'EVP_DecryptFinal_ex:bad decrypt' error
  // console.log(decryptedPayloadHex);
};

The decryption result, though, is always empty.

The nodejs docs state that update returns the value as string in given encoding, if provided, otherwise as Buffer. Nevertheless I tried using final as well, but no success.

P.S. In fact, I receive the encryptedPayload value and the iv from external source (they're not encrypted and generated by me), but I decided to test out the encryption (I have the plain payload value) and my encryption returns the same result as the one that I'm receiving externally.

Upvotes: 0

Views: 2254

Answers (1)

Milkncookiez
Milkncookiez

Reputation: 7377

Ok, so the problem turned out to be the padding. I got inspiration from here. I simply added

decipher.setAutoPadding(false);

right after I crete the decipher object.

That is weird though, because padding problems could occur when encryption is done in one language and decryption in another, but should not happen when encryption and decryption are done in the same language (as I did my testing here)... If anyone has comments on the padding issue - please add them, so that future viewers can gain knowledge (as well as me).

Upvotes: 2

Related Questions