节点加密AES解密问题



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

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

预期0/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;
}

这里有几个问题:

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

  • crypto.createDecipher()password参数不是您想的那样。它实际上只是一个值,用MD5进行散列以生成所需的解密密钥。相反,你需要的是crypto.createDecipheriv(),它接受一个键和IV。在ECB的情况下,IVs不使用,所以你可以为该参数传递一个空Buffer。

  • 您没有调用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
));

最新更新