3

SealedObjectsを使用してRMI接続を介してデータを送信しようとしています

ターゲットはSealedObjectであり、暗号は事前に初期化されています(私が知る限り、適切に)が、次のコードを実行すると、メッセージとともにIOExceptionが発生します

invalid stream header: 52FAA4D1

ここで、54FAA4D1は毎回異なる8文字の16進文字列です。

問題のコードは

target.getObject(cipher);

ターゲットも暗号もnullではないので、問題は暗号の設定方法にあると思います。キーはクライアントとサーバーの両方でまったく同じ方法で作成されるため、私は停止しています。

暗号はを使用して作成されます

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

//Do this to get the same parameters as were used on the client side
cipher.init(Cipher.ENCRYPT_MODE, this.key);
AlgorithmParameters parameters = cipher.getParameters();

//Set to decrypt mode using the same parameters
byte[] iv = parameters.getParameterSpec(IvParameterSpec.class).getIV();
cipher.init(Cipher.DECRYPT_MODE, this.key, new IvParameterSpec(iv));

真ん中のセクションを使用する場合と使用しない場合の両方を試しましたが、どちらも機能しないようです。

2回目にcipher.init()の最後のパラメーターを削除すると、InvalidKeyExceptionが発生し、中央のセクションを完全に削除して、cipher.getParameters.getParameterSpec(IVParameterSpec.class).getIV();を使用します。NullPointerExceptionが発生します

そうそう、完全に立ち往生しています-問題が何であるかを理解することでさえ感謝されるどんな助けもありがたいです。

4

1 に答える 1

4

クライアントを呼び出すcipher.init(Cipher.ENCRYPT_MODE, key)と、ランダムなIVが生成されます。サーバーでは、への最初の呼び出しciper.initは、着信メッセージと一致しない別のランダムIVを生成するだけなので、意味がないことgetObjectだけがわかります。

各メッセージの暗号化に使用されたのと同じIVを使用して各メッセージを復号化する必要があります。この場合、おそらく暗号の前にIVを追加することができます。次に、IVをサーバー上のバイト配列に読み込み、それを使用して復号化を初期化します。

于 2012-03-06T03:10:52.790 に答える