我们已经获得了加密文本和密码短语。除此之外,他们还告知文本已使用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
));