Node.js AES解密

时间:2013-07-02 22:40:45

标签: python node.js encryption aes

我在python中有一些解密代码需要移植到节点。我似乎无法正确解密,我会发疯。

我的python代码是:

from Crypto.Cipher import AES

mode = AES.MODE_ECB
secret = "9kL8yb/3Tu2czOr5qfiGPgJmx25s+T15"
cipher = AES.new(secret, mode)

DecodeAES = lambda c, e: c.decrypt(e.decode("hex"))
incoming = '813411aa65dcb66802a6e4d5995d8302'

pre_add = DecodeAES(cipher, incoming)
print pre_add

传入的结果是0004a38bc14e7533,这是正确的。

对不起,我对节点和javascript很新。

我需要以某种方式从node.js

获得完全相同的东西

到目前为止,我有以下节点:

var crypto = require('crypto');


var ciphertext = '813411aa65dcb66802a6e4d5995d8302';
var key = '9kL8yb/3Tu2czOr5qfiGPgJmx25s+T15';
var binkey = new Buffer(key, 'binary');


var decipher = crypto.createDecipher('aes-256-ecb', binkey, '');
decipher.setAutoPadding(auto_padding=true);

var dec = decipher.update(ciphertext, 'hex');
dec += decipher.final();

我对文档的理解的另一个更新

请帮助我绝望。

非常感谢

强尼

1 个答案:

答案 0 :(得分:2)

没有人会将您的Python代码移植到JavaScript。特别是你奇怪的非Pythonic Python代码(为什么你会foo = lambda blah而不只是def foo(blah)?)。

但是这里是如何开始的:

Node.js带有一个名为crypto的模块,其功能与您正在使用的PyCrypto模块类似,并不令人惊讶。

与Python不同,Node模块具有用于加密和解密的单独对象。创建密码的函数称为crypto.createCipher,创建解密的函数为crypto.createDecipher

正如文档所说,从这些函数中获取的对象是读写流。您将加密数据写入Decipher流,并读取解密数据。


与此同时,这段Python代码非常愚蠢:

DecodeAES = lambda c, e: c.decrypt(e.decode("hex"))
如果你这样写的话,

...可能更容易阅读:

def DecodeAES(cipher, hexdata):
    bindata = hexdata.decode("hex")
    return cipher.decrypt(bindata)

您可能会注意到它对传入的十六进制数据做了两件事。但是,您尝试的等效节点代码只执行这两项中的一项。这不太可行。


在新版本的Node代码中,您可以执行以下操作:

var BinCipher = new Buffer(ciphertext, 'binary');

显然应该和Python做同样的事情:

bindata = hexdata.decode("hex")

显然没有,因为你没有将hex放在任何地方。尝试将其打印出来,看看你得到了什么:

> console.log(BinCipher)
<Buffer 65 35 38 31 61 63 62 38 33 30 30 64 64 38 34 31 38 33 33 30 30 39 64 65 36 37 33 36 37 35 39 33>

显然,65是字母e35是数字5,等等。您还没有完成任何事情。与Python版本比较:

>>> print repr(bindata)
'\xe5\x81\xac\xb80\r\xd8A\x830\t\xdeg6u\x93'

此处,第一个字符为\xe5,下一个字符为\x81。这就是你想要的。

我甚至不确定你为什么认为首先需要Buffer。如果您阅读了我上面链接的文档,它们会清楚地表明您可以将“'binary''base64''hex'”输入和输出编码直接传递给Decipher方法

相关问题