AES暗号化後のデータのサイズを知りたいので、主にサイズを知るためにAES後のデータ(ディスクまたはメモリ上)をバッファリングしないようにします。
128ビットのAESとjavax.crypto.Cipher
およびjavax.crypto.CipherInputStream
暗号化用。
さまざまな入力サイズで実行されたいくつかのテストは、以下のように計算された暗号化後のサイズが正しいことを示しています。
long size = input_Size_In_Bytes;
long post_AES_Size = size + (16 - (size % 16));
しかし、上記の式がすべての可能な入力サイズに適用できるかどうかはわかりません。
AES暗号化を適用した後にデータのサイズを計算する方法はありますか?事前に暗号化されたデータを(ディスクまたはメモリに)バッファリングせずに、暗号化後のサイズを知る必要がありますか?
AESのキーサイズに関係なく、16バイトの固定ブロックサイズがあります。 PKCS 5/7パディングを使用すると仮定すると、この式を使用して、
cipherLen = (clearLen/16 + 1) * 16;
クリアテキストがブロックサイズの倍数である場合、パディングにはまったく新しいブロックが必要であることに注意してください。平文は16バイトだとしましょう。暗号テキストは32バイトかかります。
IV(初期ベクトル)を暗号テキストとともに保存することができます。その場合、IVに16バイトを追加する必要があります。
ブロック暗号としてのAESは、サイズを変更しません。入力サイズは常に出力サイズです。
ただし、ブロック暗号であるAESでは、入力がブロックサイズ(16バイト)の倍数である必要があります。このため、一般的な PKCS5 と同様に、パディングスキームが使用されます。したがって、答えは、暗号化されたデータのサイズは使用されるパディング方式に依存するということです。しかし同時にall既知のパディング方式は次のモジュールの16サイズに切り上げられます(サイズAESのブロックサイズは16バイトです)。
AESを使用するモードによって異なります。持っているものは、ECBやCBCなど、ほとんどのブロック指向モードで正確です。 OTOH、CFBモード(一例)では、基本的にAESを使用してバイトストリームを生成します。これは、入力のバイトでXOR。出力は、上記のように次のブロックサイズに切り上げられるのではなく、入力のサイズのままにすることができます。
一般的に、ブロック暗号暗号化の場合:
CipherText = PlainText + Block PlainText MODブロック)
暗号文サイズは、次のブロックに拡張された平文のサイズとして計算されます。パディングが使用され、プレーンテキストのサイズがブロックサイズの正確な倍数である場合、パディング情報を含む1つの余分なブロックが追加されます。
AESは16バイトのブロックサイズを使用し、以下を生成します。
CipherText = PlainText + 16-(PlainText MOD 16)
ソース:---(http://www.obviex.com/articles/CiphertextSize.pdf
注意:
AES暗号は常に16バイト(128ビット)ブロックで機能します。入力バイト数が16の正確な倍数でない場合は、パディングされます。 16が計算の「マジックナンバー」のように見えるのはそのためです。あなたが持っているものはすべての入力サイズで動作するはずです。
AESは128ビット(16バイト)ブロックで動作し、クリアテキストブロックを同じ長さの暗号テキストブロックに変換します。 16バイトより短い場合、最後のブロックにパディングが行われるため、式は正しく見えます。
入力長がintの最大サイズより小さい場合は、 Cipher.getOutputSize(int) を使用できます