2

Ruby クライアントと Python サーバーの間で暗号化されたデータを送信できるようにする必要があり (逆も同様)、ruby-aesのgem/library で問題が発生しています。このライブラリは非常に使いやすいですが、Python 用の pyCrypto AES ライブラリとの間でデータを渡すのに問題がありました。これらのライブラリは、使用されているのが 1 つだけの場合は問題ないように見えますが、言語の境界を越えてうまく機能していないようです。何か案は?

編集:SOAPを介して通信を行っており、バイナリデータをbase64に変換しようとしましたが、役に立ちませんでした。また、暗号化/復号化は、2 つの間でほとんど同じではありませんが、完全に同じではありません (たとえば、長さが 1 つ異なるか、復号化された文字列の末尾に余分な文字列があります)。

4

5 に答える 5

5

(たとえば、長さが 1 つ異なるか、復号化された文字列の末尾に余分な文字化けがあります)

私はそのビットを逃した。暗号化/復号化に問題はありません。パディングの問題のように聞こえます。AES は、常に 128 ビットのブロックでデータをエンコードします。データの長さが 128 ビットの倍数でない場合、暗号化の前にデータをパディングし、暗号化後にパディングを削除/無視する必要があります。

于 2008-10-13T13:12:42.890 に答える
3

何が起こったのかというと、ruby-aes は自動的にデータをパディングして 16 文字を埋め、最後の文字列の最後に区切り文字としてヌル文字を貼り付けます。PyCrypto では 16 文字の倍数を実行する必要があるため、ruby-aes が何をしているのかを突き止めました。

于 2008-10-13T07:17:02.110 に答える
2

詳細な情報がなければ、何が起こっているのかを推測することさえ困難です...

私があなたなら、あなたの Python および Ruby プログラムで次のことを確認します。

  1. キーは同じです(明らかに)。それらを 16 進数としてダンプし、各バイトを比較します。
  2. 初期化ベクトルは同じです。これはpyCryptoのパラメーターIVです。AES.new()それらも16進数としてダンプします。
  3. モードは同じです。pyCryptomodeのパラメーター。AES.new()

IVとの pyCrypto にはデフォルトがありますがmode、それらが Ruby 実装と同じであるとは信じないでください。CBC などの単純なモードのいずれかを使用します。PTR などの複雑なモードがどのように機能するかについて、ライブラリが異なれば解釈も異なることがわかりました。

ウィキペディアには、ブロック暗号モードについての素晴らしい記事があります。

于 2008-10-13T07:05:19.963 に答える
1

基本的にヒューが上で言ったこと: IV、キーサイズ、チェーンモードをチェックして、すべてが同一であることを確認してください。

両側を独立してテストし、いくつかの情報をエンコードし、Ruby と Python がそれを同じように終了したことを確認します。puts問題は暗号化に関係していると想定していますが、データにランダムな改行をスローする暗号化されたデータを送信するのと同じくらい簡単なことかもしれません。データが正しく暗号化されていることを確認したら、送信したと思われる内容が正確に受信されていることを確認してください。データを破損するステージが見つかるまで、段階を追って進みます。

また、外部の gem を使用する代わりに、Ruby の標準ライブラリに含まれている openssl ライブラリを使用することをお勧めします。

于 2008-10-13T13:01:08.483 に答える
1

種類は、暗号化されたデータを転送する方法によって異なります。ある言語でファイルを作成し、それを別の言語から読み込もうとしている可能性があります。Python (特に Windows) では、バイナリ ファイルにバイナリ モードを指定する必要があります。したがって、Python で復号化したい場合は、次のようにファイルを開く必要があります。

f = open('/path/to/file', 'rb')

「b」はバイナリを示します。暗号化されたデータを Python からファイルに書き込む場合:

f = open('/path/to/file', 'wb')
f.write(encrypted_data)
于 2008-10-13T05:42:44.530 に答える