在图书馆中,AES是否相同PyCrypto& Node.JS加密

时间:2011-03-17 21:51:16

标签: node.js aes encryption pycrypto

我开始怀疑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')

哪个吐出一堆垃圾....(将'二进制'改为十六进制/ utf8没有帮助)

因为我正在使用CBC(Cipher Block Chaining)...
我正在将IV添加到密文的开头(16个块)。 在PyCrypto中,这非常有效,类似于PGP,CFB的使用规范......

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

我期待Node.js的标准库太多了吗?

5 个答案:

答案 0 :(得分:1)

文档未提及此问题,但您传递给aeskey的{​​{1}}不是 键,而是处理OpenSSL的EVP_BytesToKey功能的密码

要传递实际的原始密钥数据,应使用(目前未记录的)crypto.createDecipher函数。这也适用于ECB模式,即使ECB中没有IV。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

buf = decipher.update(buf, 'hex', 'binary')

答案 3 :(得分:0)

这不是IV在Node中的工作原理,你必须使用crypto.createDecipheriv(cipher,key,iv),否则你会得到一个默认的烤制版本。即使在PyCrypto中,您也应该使用AES.new的第三个参数作为IV,而不是将其填充到字节流中。

答案 4 :(得分:0)

确保在pycrypto和node.js中使用相同的密钥和IV!不仅如此,还要确保两端都有相同的编码:

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

然后在node.js中(抱歉,现在无法轻松访问该代码),还要确保解密密钥并将iv解析为十六进制