1

javax.crypto.Cipherクラスを使用して、固定サイズのByteBuffer(プールされたバッファー)のシーケンシャルチェーンを任意の量の暗号化データで段階的に埋めることができるかどうかを誰かが知っていますか?つまり、他の中間バッファ配列を割り当てたり埋めたりする必要はありません。私の特定のケースの暗号化は、CBCモードのAESです。

私はCharsetEncoderのencode(CharBuffer input、ByteBuffer output、boolean endOfInput)メソッドに似たものを望んでいました。これにより、指定された制限まで書き込み、必要に応じて出力バッファーを切り替える機能など、出力の書き込みを適切に制御できます。

額面どおり、これは、呼び出しの前に入力の制限が設定されているCipherのupdate(ByteBuffer input、ByteBuffer output)メソッドを使用して実現できるように見えます。出力バッファの容量の超過を回避するため。APIドキュメントを正しく理解している場合でも、Cipher実装は、このメソッドの呼び出し間で暗号化されたデータをバッファリングする可能性があるため、update()またはdoFinal()を1回呼び出すと、より大きな容量の出力ByteBufferが必要になる可能性があります。プールの固定サイズのバッファーから利用できるもの。その場合、両方の方法のドキュメントによると:

output.remaining()バイトが結果を保持するには不十分な場合、ShortBufferExceptionがスローされます。この場合、より大きな出力バッファでこの呼び出しを繰り返します。getOutputSizeを使用して、出力バッファーの大きさを決定します。

これを回避する方法があるかどうか誰かが知っていますか?おそらく、過度のバッファの蓄積を防ぐために、update()呼び出しの間に暗号化されたデータをフラッシュする何らかの方法...?私はまだCipherOutputStreamを試す道を進んでいません。繰り返しになりますが、主要な目標は、中間のバイト配列を割り当てたり埋めたりすることなく、一連の固定サイズのByteBufferに暗号化されたデータを直接入力することです。

4

2 に答える 2

0

データが恣意的である場合、なぜそれを暗号化する必要があるのですか?ランダムなデータを生成し、それをバイト配列にフィードするだけです。暗号化セキュリティについては、のような暗号品質のRNGを使用してSecureRandomください。これを使用して、必要な数のバイトを生成できます。を参照してくださいSecureRandom.nextBytes()

そうでなければ、あなたはすでにあなたの問題の解決策について言及していると思います:CipherOutputStream

于 2012-10-14T16:01:38.547 に答える
0

同様のニーズを調査することになった人のために:

最終的にはCipherのupdate(ByteBuffer input, ByteBuffer output)メソッドを使用してByteBufferにデータを入力しましたが、固定長のチェーンを切り替えるのではなく、1つの出力バッファーのみを使用していました。ドキュメントが示唆しているように(そして私がこのメソッドを避けようとした限り)、getOutputSize()の呼び出しを使用して、次のupdate()呼び出しの出力サイズの上限を取得し、必要に応じて新しいバッファーを割り当てました。

CipherOutputStreamとそのflush()メソッドを使用するかどうかに関係なく、Cipher出力を制御できる量には制限があります。たとえば、入力の最初の15バイトがAESなどの128ビット(16バイト)のブロック暗号に送信された場合、それ以上の入力が受信されるまで、出力は常に保留されます。フラッシングは、暗号がデータのブロックサイズを超えてバッファリングするのを防ぐ可能性がありますが、可能なupdate(ByteBuffer input, ByteBuffer output)限り多くの出力をきちんと埋めて、次の呼び出しのために残りの出力を保留したい場合は、運が悪いです-バイトを使い果たすのを助けるために、独自の中間の「オーバーフロー」バッファを提供する必要があります。それは実行可能ですが、少し厄介です。

于 2012-10-22T09:57:12.320 に答える