我开始怀疑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的标准库太多了吗?
答案 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解析为十六进制