1

de CIS を閉じる必要がある (または最後の 16 バイトを取得できない) ため、問題が発生していますが、ソケット経由で使用しているため、できません。

cis = new CipherInputStream(new ObjectInputStream(socket.getInputStream));

(正確にはそうではありませんが、このように構成されています)。

したがって、ソケットを閉じると、プログラムはそれを使用しようとし、例外が発生します...

どうもありがとう!

4

1 に答える 1

1

CipherInputStreamデータの最後のブロックを読み取るために a を閉じる必要はありません。それは意味がありません。

何が起こっているかというとCipherInputStream、最終的な暗号テキスト ブロック内のすべてのデータを読み取ったがread()、基になるストリームの呼び出しでブロックされているということです。ストリームの終わりが検出されると、 の代わりに がその暗号でCipherInputStream呼び出されます。通常、これは、ソケットが閉じられたため、ストリームの終わりに達したために発生します。doFinal()update()

ソケットを閉じたくない場合は、暗号文の長さを知る必要があります。これは、HTTP ヘッダー、または暗号化されたデータを送信するために作成したその他のプロトコルに由来する可能性があります。

消費されたバイト数を追跡​​するクラスで拡張FilterInputStreamし (メソッドを忘れないでください)、指定された長さの暗号テキストが読み取られたときにメソッドskip()から -1 を返します。read()派生クラスのメソッドをオーバーライドしてclose()、基になるストリームを閉じないようにします。

于 2013-05-01T01:07:20.317 に答える