我使用AES在线工具加密。我正在使用我的模块解密。但我得到的结果并不相同。为什么呢?
我使用其中一个加密工具:
这是我提供的数据:
Hello World
12345
U2FsdGVkX19HLG+YDMe3kYl+MYwEMlnC5mK78s3rZZg=
现在我尝试使用node解密它,并没有给我相同的结果。但是一切都很好用
var crypto = require('crypto'),
algorithm = 'aes-128-ctr',
password = '12345';
module.exports.decrypt=function(text){
var decipher = crypto.createDecipher(algorithm,password)
var dec = decipher.update(text,'base64','utf8')
dec += decipher.final('utf8');
return dec;
}
text=module.exports.decrypt('U2FsdGVkX1+OOp0KE3lv6qcKQeS/JDFPF8YhgdU131o=')
text
我尝试更改为AES-192,并遇到了同样的问题。
更新:(基于zaph响应)
这是我在此处输入的新数据:https://www.tools4noobs.com/online_tools/encrypt/
我无法解密。这是我的代码:
var crypto = require('crypto'),
algorithm = 'aes-128-cbc',
password = '0123456789abcdef';
module.exports.decrypt=function(text){
var decipher = crypto.createDecipher(algorithm,password)
var dec = decipher.update(text,'hex','utf8')
dec += decipher.final('utf8');
return dec;
}
if(!module.parent){
var text=module.exports.decrypt('8b25e846b6a2d52ad87f38f8134906c3')
console.log(text)
}
答案 0 :(得分:1)
使用精确长度的加密密钥以避免非标准填充(处理不正确长度的密钥时没有标准)。 AES支持128 192和256位长度密码(16,24和32字节)。显然12345
不符合支持的密码长度。
一般最好不要使用CTR模式,很容易弄错。问题是相同的密钥和计数器必须永远重用。通常CBC模式与随机IV一起使用,PKCS#7填充用于容纳不是块大小倍数的输入。
输出U2FsdGVkX19HLG+YDMe3kYl+MYwEMlnC5mK78s3rZZg=
是Base编码的32字节,是块大小的两倍,因此除了输出中的加密数据之外还有其它内容。
在CTR模式下,在Rijndael-128(即AES)的https://www.tools4noobs.com/online_tools/encrypt/中输入密码和文本会产生53TI1is8kfYkztQ=
,而不是问题中的结果。请注意,此工具使用仅支持非标准填充的mcrypt。
答案 1 :(得分:0)
这是我在NodeJS中加密和解密AES-256的最终代码。使用IV
和key
(password
)。
var crypto = require('crypto')
var algorithm = 'aes-128-cbc'
var key = 'AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
var iv = 'AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
key=new Buffer(key,'hex')
iv=new Buffer(iv,'hex')
module.exports.encrypt=function(text){
var cipher = crypto.createCipheriv(algorithm,key,iv)
text=new Buffer(text)
var crypted = cipher.update(text,'utf-8','base64')
crypted += cipher.final('base64');
return crypted;
}
module.exports.decrypt=function(text){
var decipher = crypto.createDecipheriv(algorithm,key,iv)
dec = decipher.update(text,'base64','utf-8');
dec += decipher.final();
return dec;
}
if(!module.parent){
var enc=module.exports.encrypt('Exaxmple of encoding')
console.log(enc)
var dec=module.exports.decrypt(enc)
console.log(dec)
}