【问题标题】:NodeJS aes decrypt not workingNodeJS aes解密不起作用
【发布时间】:2016-11-16 17:33:17
【问题描述】:

我使用在线工具使用 AES 进行加密。我正在使用我的模块进行解密。但我得到的结果不一样。为什么?

我使用其中一种工具进行加密:

这是我提供的数据:

  • 这是要加密的文本:Hello World
  • 这是密码:12345
  • 这是工具的结果:U2FsdGVkX19HLG+YDMe3kYl+MYwEMlnC5mK78s3rZZg=

现在我尝试使用节点解密它,但它没有给我相同的结果。但一切正常

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/

  • 密钥:0123456789abcdef(16 字节)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)
}

【问题讨论】:

    标签: javascript node.js encryption cryptography


    【解决方案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 仅支持非标准填充。

    【讨论】:

    • 感谢您提供的信息。我正在做的任何事情都无法成功解密它 NodeJS。我把这些数据放在网站上:使用密钥:0123456789abcdef (16 bytes) Rijndael-128。模式:CBC。编码:十六进制。结果如下:8b25e846b6a2d52ad87f38f8134906c3
    • 这是我的代码:pastebin.com/MBpz1vL1 我无法解密我在网站上加密的数据。为什么?
    • 对于 CBC 模式,您还需要提供 16 字节的 IV。
    • 这是一个online encryption 示例,没有填充:
    【解决方案2】:

    这是我在 NodeJS 中使用 AES-256 进行加密和解密的最终代码。使用IVkey (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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多