3

AES の実装がライブラリ間で異なるかどうか疑問に思い始めています..

現在、PyCrypto で暗号化された平文があります。
Node.jsのCrypto Libraryで暗号文を解読しようとしています..

基本的には PyCrypto
を使用します。ランダムに生成された IV で AES-128-CBC を使用しています。(これは 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')

ガベージの束を吐き出す....(「バイナリ」をhex/utf8に変更しても役に立たない)

私はCBC(Cipher Block Chaining)を使用しているため...
暗号文の先頭にIVを追加しています(16ブロック)..PyCryptoでは、これはPGPの仕様、CFBの使用法と同様に完全に機能します..

これが機能しない理由を誰かが知っていますか???

Node.js の標準ライブラリに期待しすぎていませんか?

4

5 に答える 5

1

ドキュメントではこれについて言及されていませんが、aeskey渡すのはキーでcrypto.createDecipherはなく OpenSSL のEVP_BytesToKey機能に処理されるパスワードです。

実際の生の鍵データを渡すには、(現在文書化されていない)crypto.createDecipheriv(cipher, key, iv)関数を使用する必要があります。ECB には IV がありませんが、これは ECB モードにも当てはまります。

これが失敗した場合、デバッグの最初のステップは、AES KATを試して、復号化コードが正しいかどうかを確認することだと思います。

ここで同様の問題につまずきました: https://github.com/joyent/node/issues/1318

于 2011-07-13T14:04:58.700 に答える
0

AES は Rijndael 標準です。それは違うべきではありません。非表示になっているデータ型とデフォルト設定を調べる必要があります。両者の間で何かを設定する必要があります。128ビットの「hello」にはゼロが埋め込まれているため、キーのサイズは異なる場合があります。小さいキーは「hello」で始まりますが、パディングが小さいため、異なります。

于 2011-03-17T21:58:12.067 に答える
0

あなたの質問に対する簡単な答えは次のとおりです。はい、AES は PyCrypto と Node.js のcryptoモジュールで同じです。Nodecryptoはシステムの単なるラッパーopensslであり、PyCrypto は OpenSSL と相互運用可能です ( http://lists.dlitz.net/pipermail/pycrypto/2010q4/000301.htmlを参照)。

そうは言っても、Nodecryptoモジュールには間違いなくバグがあります (ただし、私自身は base64 エンコーディングの問題しか経験していません)。したがって、バグであるかどうかにかかわらず、発生している問題はほぼ確実にデータのエンコード/デコード段階で発生しています。

あなたはどのciphertextように見えますか?16進数の文字列ですか?もしそうなら、あなたはする必要があります

buf = decipher.update(buf, 'hex', 'binary')
于 2011-03-18T15:37:38.143 に答える
0

それは Node での IV の動作ではありません。代わりに crypto.createDecipheriv(cipher, key, iv) を使用する必要があります。そうしないと、デフォルトの組み込みのものが得られます。PyCrypto でも、AES.new の 3 番目の引数を IV として使用し、バイトストリームに詰め込まないでください。

于 2011-03-19T03:18:44.473 に答える
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を16進数にデコードすることも確認してください

于 2012-02-01T20:30:34.177 に答える