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に暗号化されたデータを直接入力することです。