【发布时间】: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