Node Crypto AES解密问题

时间:2016-09-07 07:05:10

标签: node.js cryptography aes

我们已获得加密文字和密码短语。除此之外,他们还告知该文本已使用AES-128加密

加密文本 - 5vCGQXtdj7GZtwwhwVOquSyR / qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY 密码/密码 - FX4DqkZCb4KI6BWF

预期的O / P - e23f95c7-79c2-4c6f-9408-411bcfaf3665

现在我从http://aesencryption.net/在线解密 它确实会生成Guid,但它不能与任何其他在线工具一起使用。

另外,我需要在Node Js中实现相同的功能。 我使用了下面提到的代码,但仍然不起作用,从而生成不需要的数据。

var aesDecrypt = (text, password, bit) => {
  debugger;
  var crypto = require('crypto');
  var decipher = crypto.createDecipher('aes-' + bit + '-cbc', password);
  decipher.setAutoPadding(false);
  var plaintext = decipher.update(text, 'base64', 'utf8');
  var token = plaintext.toString();
  return token;
}

1 个答案:

答案 0 :(得分:1)

这里有一些问题:

  • 正在使用CBC模式,但文本是使用ECB模式加密的(我通过查看您链接到的网站上的代码示例中的默认模式来猜测这一点。)

  • crypto.createDecipher()' password参数不是您认为的那样。它实际上只是一个用MD5进行哈希处理以生成所需解密密钥的值。相反,你需要的是crypto.createDecipheriv(),它接受​​一个密钥和IV。对于ECB,不使用IV,因此您只需为该参数传递一个空缓冲区。

  • 您没有调用decipher.final()来获取任何可能剩余的输出。 IIRC也是如果你在文本中有多字节字符,如果字符的字节在调用decipher.update(text, 'base64', 'utf8')时被分割,那么调用.update() 会导致解密数据损坏和/或.final()

  • 在字符串上调用.toString()无效。

考虑到所有这些,这里的代码将适用于您的示例输入:

var aesDecrypt = (text, password, bit) => {
  var crypto = require('crypto');
  var decipher = crypto.createDecipheriv('aes-' + bit + '-ecb', password, Buffer.alloc(0));
  decipher.setAutoPadding(false);
  return Buffer.concat([
    decipher.update(text, 'base64'),
    decipher.final()
  ]).toString();
}

console.log(aesDecrypt(
  '5vCGQXtdj7GZtwwhwVOquSyR/qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY',
  'FX4DqkZCb4KI6BWF',
  128
));