3

我开始怀疑 AES 的实现是否跨库不同..

目前我有一个用 PyCrypto 加密的明文。
我试图用 Node.js 的加密库解密密文。

基本上使用 PyCrypto ..
我使用 AES-128-CBC 和随机生成的 IV。(在 PyCrypto 中完美解密)

但是..
在 Node.js 上我正在这样做

var buf = new Buffer(ciphertext)
var decipher = crypto.createDecipher('aes-128-cbc',aeskey)
buf = decipher.update(buf,'binary', 'binary')
buf += decipher.final('binary')

吐出一堆垃圾....(将“二进制”更改为 hex/utf8 无济于事)

当我使用 CBC(密码块链接)时...
我将 IV 添加到密文的开头(16 个块)。在 PyCrypto 中,这完美地工作,类似于 PGP、CFB 使用的规范。

有谁知道这不起作用的原因是什么???

我是否对 Node.js 的标准库期望过高?

4

5 回答 5

1

文档没有提到这一点,但是aeskey您传递crypto.createDecipher不是密钥,而是密码,处理给 OpenSSL 的函数。EVP_BytesToKey

要传递实际的原始密钥数据,应该使用(目前未记录)crypto.createDecipheriv(cipher, key, iv)函数。这也适用于欧洲央行模式,即使欧洲央行没有 IV。

如果这失败了,我认为,调试的第一步是尝试使用AES KAT来查看解密代码是否正确。

我在这里遇到了类似的问题:https ://github.com/joyent/node/issues/1318

于 2011-07-13T14:04:58.700 回答
0

Make sure you use the same key and IV in both pycrypto and node.js!! Not only that, but make sure you have the same encoding in both ends:

cipher = AES.new(key.decode('hex'), AES.MODE_CBC, iv.decode('hex'))
text = json.dumps(payload)  
pad = lambda s: s + (16 - len(s) % 16) * '\x07'     
encryptedText = base64.b64encode(cipher.encrypt(pad(text)))

Then in node.js (sorry, no easy access to that code now), also make sure you decode your key and iv to hex

于 2012-02-01T20:30:34.177 回答
0

对您的问题的简短回答是:是的,AES 在 PyCrypto 和 Node.js 的crypto模块中是相同的。Nodecrypto只是openssl您系统上的一个包装器,PyCrypto 可以与 OpenSSL 互操作(参见http://lists.dlitz.net/pipermail/pycrypto/2010q4/000301.html)。

话虽如此,Nodecrypto模块中肯定存在错误(尽管我自己只遇到过 base64 编码的问题)。因此,无论是否是错误,您遇到的问题几乎肯定发生在数据编码/解码阶段。

ciphertext看起来像什么?它是十六进制字符串吗?如果是这样,那么你需要做

buf = decipher.update(buf, 'hex', 'binary')
于 2011-03-18T15:37:38.143 回答
0

AES 是 rijndael 标准。它不应该是不同的。您应该查看隐藏的数据类型和默认设置。必须在两者之间设置不同的东西。密钥大小可能不同,因为我认为 128 位“hello”用零填充,较小的密钥将以“hello”开头,但填充较小,因此不同。

于 2011-03-17T21:58:12.067 回答
0

这不是 IV 在 Node 中的工作方式,您必须改用 crypto.createDecipheriv(cipher, key, iv) ,否则您会得到一个默认的内置密码。即使在 PyCrypto 中,您也应该使用 AES.new 的第三个参数作为 IV,而不是将其填充到字节流中。

于 2011-03-19T03:18:44.473 回答