-1

我在 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。

对不起,我对 node 和 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();

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

请帮助我变得绝望。

非常感谢

强尼

4

1 回答 1

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方法。

于 2013-07-02T22:50:22.870 回答