-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 モジュールと機能が似ているというモジュールが付属しています。

Node モジュールには、Python とは異なり、暗号化と復号化のための個別のオブジェクトがあります。暗号を作成する関数は と呼ばれ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)

着信 16 進データに対して 2 つの処理を行うことに気付くかもしれません。しかし、あなたが試みた同等の Node コードは、これら 2 つのことのいずれかのみを行います。それはうまくいかないでしょう。


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 に答える