解密返回空结果 - nodejs crypto

时间:2016-10-31 13:41:26

标签: node.js encryption aes

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);
};

但是,解密结果始终为空。

nodejs docs声明update在给定编码中将值返回为字符串(如果提供),否则返回Buffer。不过我尝试使用final,但没有成功。

P.S。实际上,我从外部源收到encryptedPayload值和iv(它们没有加密并由我生成),但我决定测试加密(我有普通{{1}我的加密返回与我在外部接收的结果相同的结果。

1 个答案:

答案 0 :(得分:0)

好的,所以问题原来是填充。我得到了灵感from here.我只是添加了

decipher.setAutoPadding(false);
在我抓住decipher对象后立即

这很奇怪,因为填充问题可能发生在一种语言加密和另一种语言加密时,但加密和解密用同一种语言完成时不应该发生(就像我在这里测试一样)......如果有人对填充问题有评论 - 请添加它们,以便未来的观众可以获得知识(以及我)。