NodeJS解密不起作用

时间:2016-11-16 17:33:17

标签: javascript node.js encryption cryptography

我使用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/

  • key:0123456789abcdef(16 bytes)Rijndael-128。模式:CBC。编码:十六进制。
  • 结果如下:8b25e846b6a2d52ad87f38f8134906c3

我无法解密。这是我的代码:

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)
}

2 个答案:

答案 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的最终代码。使用IVkeypassword)。

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)
}