2011-10-24 10 views
3

私はサードパーティプラットフォームを使用してランディングページを作成していますが、これは特定のプラットフォームを使用するビジネス要件です。.NETとJava間の対称暗号化

自分のページでは、自分のサイトでリソースを呼び出すときに、データを暗号化してリクエストパラメータを通じてサーバーに送信できます。これは、AES対称暗号化によって行われます。

パスワード、salt(16進値でなければならない)、および初期化ベクトル(ただし16文字)を指定する必要があります。

バックエンドは.NETプラットフォームです。それは期待するよりも、私は長いIVを指定した場合、根本的な例外はあるので、私はこれを知っている:

System.Security.Cryptography.CryptographicException: Specified initialization vector (IV) does not match the block size for this algorithm. Source: mscorlib

したがって、たとえば、彼らの終わりに私は指定:

EncryptSymmetric("Hello World","AES","P4ssw0rD","00010203040506070809", "000102030405060708090A0B0C0D0E0F")

の入力がある場合:プレーンテキスト、アルゴリズム、パスフレーズ、ソルト、およびIV。

私は値を取得する:私がしようとするとJCEかはBouncyCastleプロバイダを使用して、私の側でこれを復号化する場合eg/t9NIMnxmh412jTGCCeQ==

は、私は(同じアルゴ、千回の反復とフレーズ、塩& IVを、パス)を取得:2rrRdHwpKGRenw8HKG1dsA==完全に異なっている。

私はAESを解読する方法についてオンラインで多くのJavaサンプルを見てきました。 http://blogs.msdn.com/b/dotnetinterop/archive/2005/01/24/java-and-net-aes-crypto-interop.aspx

Javaプラットフォーム上で.NETフレームワークによって生成されたパスフレーズ、塩、IVを使用するAES対称暗号化を復号化するにはどうすればよいですか?

私は、Java側で同じシグネチャを生成して比較することができれば、必ずしも暗号化文字列の内容を復号化する必要はありません(実際に生成されたものがハッシュであることが判明した場合)。

私はJDK 1.5を本番環境で使用していますので、これを行うには1.5を使用する必要があります。

Javaの多くの例では、Java側では繰り返し回数を指定する必要がありますが、.NET側では繰り返し回数を指定する必要があります。デフォルトの.NET出力と一致するJava側で指定する必要がある反復の標準回数はありますか?

+0

プログラミング言語にかかわらず同じ値に解読する必要があるので、Javaの代わりにC#で解読しようとしましたか?別の言語で解読コードを構築することは、実装上の違いを見つけるのに役立つかもしれません。 –

+0

私はC#のプログラマーではないので、どこから始めるべきかはわかりません。私はこの他のプラットフォームとやりとりしようとしています。 – Dominic

+0

AESをサポートする暗号APIを持っている限り、他のどの言語を使ってもこれを試すことができます。もう1つの考えは、ソースマシンとターゲットマシン上のプレーンテキストのエンコーディングが異なることでしょうか?例えば。 UTF-8とUTF-16。 –

答えて

2

これは、暗号化のさまざまな部分/引数がどのように使われるかに依存する。

バイトを暗号化するためにAESが使用されます。したがって、文字列をバイト配列に変換する必要があります。したがって、文字列を変換するために使用されるエンコーディングを知る必要があります。 (UTF7、UTF8、...)。

AESのキーには固定サイズがいくつかあります。だから、正しいビットサイズでAESキーへのパスフレーズから来る方法を知る必要があります。

あなたは塩とIVの両方を提供しているので、塩はIVではないと思います。 .NetでSaltを処理する標準的な方法はありません。私が覚えている限り、塩は主に虹のテーブルやハッシュから保護するために使用されます。 AESでの塩の必要性は私には分かりません。

おそらく、パスフレーズがAESキーを取得するために塩でハッシュされている(その方法を提供していない)かもしれません。

IVは秘密ではありません。最も簡単な方法は、暗号化されたデータをIVに付加することです。暗号化されたデータの長さを見ると、そうではありません。

私はあなたの不慣れなことは、ここでは問題ではないと思います。あなたは、暗号化された文字列へのあなたのパラメータから来るように、暗号化の実装者がどのような決定をしたのかを知る必要があります。

+0

「AESの塩の必要性は私には不明です。たぶん私はそれを誤解しているかもしれませんが、確かにAESは他のブロック暗号と同様にレインボーテーブルに対して脆弱ですか? –

+0

ハッシュ関数は常に同じバイト数(ハッシュ)になります。 1つのユニークなハッシュ結果は、複数の入力から返すことができます。したがって、ハッシュからの結果のセットは限られています。この集合からすべての結果を取ると、可能な入力を計算することができます。これにより、虹のテーブルを作ることができます。 (塩は無限の数の結果を生成するために使用されます)AESの場合、すべての入力が一意の暗号化された結果に解決されるため、結果セットは無限になります。 – GvS

+1

+1。 Dominicは、正確なアルゴリズムの組み合わせが使用されているビジネスパートナ(サードパーティのサイトを提供するパートナー)に質問する必要があります。無意味な推測以外に、これを回避する方法はありません。 –

1

私が見る限り、問題を引き起こしているのは繰り返し回数です。すべてのものが同じであれば(塩、IV、反復)、.Net実装はJava実装と同じ出力を生成します。私はあなたが使用している反復を第三者に尋ねる必要があるかもしれないと思う。