3

サードパーティのプラットフォームを使用してランディングページを作成しています。この特定のプラットフォームを使用することはビジネス要件です。

彼らのページでは、データを暗号化して、サイトのリソースを呼び出すときにリクエストパラメーターを介してサーバーに送信できます。これは、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です。

私は値を取得します:eg/t9NIMnxmh412jTGCCeQ==

JCEまたはBouncyCastleプロバイダーを使用してこれを復号化しようとすると(同じアルゴリズム、パスフレーズ、salt&IV、1000回の反復):2rrRdHwpKGRenw8HKG1dsA==これは完全に異なります。

AESを復号化する方法について、オンラインでさまざまなJavaの例を見てきました。そのようなデモの1つは次のとおりです。http://blogs.msdn.com/b/dotnetinterop/archive/2005/01/24/java-and-net-aes-crypto-interop.aspx

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

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

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

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

4

2 に答える 2

2

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

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

AESのキーにはいくつかの固定サイズがあります。したがって、パスフレーズから正しいビットサイズのAESキーに変換する方法を知っておく必要があります。

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

たぶん、パスフレーズはAESキーを取得するためにソルトでハッシュされます(そのためのメソッドを提供しませんでした)。

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

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

于 2011-10-24T08:40:59.700 に答える
1

私が見る限り、問題を引き起こしているのは反復回数です。すべてが同じ(salt、IV、iterations)の場合、.Net実装はJava実装と同じ出力を生成します。サードパーティにどのイテレーションを使用しているかを尋ねる必要があると思います

于 2011-10-24T08:40:16.630 に答える