节点加密 AES 解密问题
Node Crypto AES decrypt issue
我们已获得加密文本和密码。除此之外,他们还告知文本已使用 AES-128
加密
加密文本 - 5vCGQXtdj7GZtwwhwVOquSyR/qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY
Passphrase/password - 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;
}
这里有几个问题:
正在使用 CBC 模式,但文本是使用 ECB 模式加密的(我通过查看您链接到的站点上的代码示例中的默认模式猜到了这一点)。
crypto.createDecipher()
的password
参数不是你想的那样。它实际上只是一个用 MD5 散列以生成所需解密密钥的值。相反,您需要的是接受密钥和 IV 的 crypto.createDecipheriv()
。在 ECB 的情况下,不使用 IV,因此您可以为该参数传递一个空缓冲区。
您调用 decipher.final()
并不是为了获取任何可能剩余的输出。此外,如果文本中有多字节字符,调用 decipher.update(text, 'base64', 'utf8')
可能会 导致解密数据损坏,如果字符的字节在调用 .update()
and/or .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
));
我们已获得加密文本和密码。除此之外,他们还告知文本已使用 AES-128
加密加密文本 - 5vCGQXtdj7GZtwwhwVOquSyR/qvs95ojBsmOf9DX6T31Y2yTIvjXYHf6gd8icDaY Passphrase/password - 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;
}
这里有几个问题:
正在使用 CBC 模式,但文本是使用 ECB 模式加密的(我通过查看您链接到的站点上的代码示例中的默认模式猜到了这一点)。
crypto.createDecipher()
的password
参数不是你想的那样。它实际上只是一个用 MD5 散列以生成所需解密密钥的值。相反,您需要的是接受密钥和 IV 的crypto.createDecipheriv()
。在 ECB 的情况下,不使用 IV,因此您可以为该参数传递一个空缓冲区。您调用
decipher.final()
并不是为了获取任何可能剩余的输出。此外,如果文本中有多字节字符,调用decipher.update(text, 'base64', 'utf8')
可能会 导致解密数据损坏,如果字符的字节在调用.update()
and/or.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
));