残念ながら、Bouncy Castle と Oracle/Java の実装はオンラインではありません。つまり、基になる CTR モード暗号化のオンライン プロパティは保持されません。このコンテキストでのオンラインとは、バイトが到着したときに直接暗号化/復号化されることを意味します。これは、暗号化の処理方法と認証タグの処理方法に関係している可能性があります。
AES-CTR は複数の方法で実装できます。最初にカウンターを暗号化してから、到着時に平文/暗号文で直接 XOR することができます。また、最初にプレーンテキストをバッファリングし、完全なブロックを取得したら、カウンターを作成し、それを暗号化してから、プレーンテキストの完全なブロックを XOR することもできます。これには、CBC などの他の動作モードにより似ているという意味で利点がありました。さらに、常にキー ストリームをメモリにバッファリングする必要がない場合もあります。
認証タグも別の方法で処理できます。ここでは、基本的に 3 つのオプションがあります。認証タグは、暗号文とは別のエンティティと見なすことができます。これにより、CTR モードのオンライン プロパティを維持できます。私の意見では、これが推奨されるオプションです。暗号文の一部として表示することもできますが、その場合、復号化中にオンライン プロパティが失われます。認証タグを構成する最後のバイト数を処理するには、暗号文がどこで終わるかを知る必要があります。したがって、少なくとも認証タグのバイト単位のサイズをバッファリングする必要があります。最後に、まだ復号化中に、検証後にプレーンテキスト バイトのみを返したい場合があります。平文バイトの。その場合、暗号文全体をバッファリングし、平文を一度に返す必要があります。
認証タグの問題は復号化のためだけのものであるため、CTR の実装方法が原因で、Bouncy が単にバッファリングする可能性があります。doFinal
ロバートがコメントですでに述べたように、暗号文の最後のブロックと認証タグを取得するには、実際に呼び出す必要があります。暗号化ルーチンは復号化ルーチンとある程度対称に保たれているため、暗号化がまだ実行されていない可能性があります。