【问题标题】:node.js Decipher AES 128 ECBnode.js 解密 AES 128 ECB
【发布时间】:2018-06-18 09:38:13
【问题描述】:

我尝试在节点上使用 AES 128-ecb 破译 base64 格式的令牌。

key:ed9d26Z0JES0X52Q(更改了一些字符,但长度正确)

令牌:O4girrZ2YeLSE1sZ4FSIvp3Edm1GiwBLHmvDIEYCf+xkvbxP6EfYjy+PEB2kaYe0606EyPmlCC0iExVRq9e3Iw==

  decodeToken(token) {
    var key = new Buffer(exchangeKey, 'hex')
    var encrypted = new Buffer(token, 'base64')
    decipher = crypto.createDecipheriv("aes-128-ecb", key, '')
    decipher.setAutoPadding(false)
    result = decipher.update(encrypted).toString();
    return result;
  }

给予:

crypto.js:239 this._handle.initiv(cipher, toBuf(key), toBuf(iv)); ^

错误:密钥长度无效 在错误(本机) 在新的 Decipheriv (crypto.js:239:16) 在 Object.Decipheriv (crypto.js:236:12)

经过一番搜索,我发现了这个:

// https://github.com/nodejs/node-v0.x-archive/issues/4744#issuecomment-25460050
var aesEcb = new MCrypt('rijndael-128', 'ecb')
aesEcb.open(exchangeKey);
var ciphertext = new Buffer(token, 'base64');
var plaintext = aesEcb.decrypt(ciphertext).toString();
return plaintext

什么回馈

f9712fa5-da4a-49fe-b81f-b48d8cfabf91275RAODW24RS

看起来像预期的格式和长度,但请注意末尾的连线字符。

我也可以使用这个解决方案(并修剪多余的字符),但我想

  • 知道这些字符是什么
  • 交叉引用两个结果
  • 只使用一个 npm 包(加密)

【问题讨论】:

  • 不要使用 mcrypt,它不支持 PKCS5 填充。此外,我知道这听起来令人震惊,但您收到无效密钥长度错误的原因是密钥长度无效gasp。您的密钥长度为 8 个字节,AES 要求最小密钥大小为 16 个字节。
  • @LukeJoshuaPark 我收到的那个密钥,mcrypt 用我的 8 字节密钥给出了一个正确的结果。
  • 如果密钥实际上是原始的十六进制字符,那么为什么在您的第一个代码摘录中将其解码为十六进制...?
  • @LukeJoshuaPark 因为我是盲人 :) 谢谢,它现在可以工作了,它给出了相同的结果。什么是好的,但另一方面我仍然有那些丑陋的角色。
  • 因为你没有使用 padding...

标签: node.js encryption aes ecb


【解决方案1】:

当您打算将单个十六进制字符用作密钥字节时,您将密钥解码为十六进制。不要那样做。您还禁用了填充。启用填充以删除奇怪的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2016-06-01
    相关资源
    最近更新 更多