web-dev-qa-db-ja.com

AES / CBCおよびAES / ECB暗号化後のデータのサイズ

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暗号化を適用した後にデータのサイズを計算する方法はありますか?事前に暗号化されたデータを(ディスクまたはメモリに)バッファリングせずに、暗号化後のサイズを知る必要がありますか?

58
Ramson Tutte

AESのキーサイズに関係なく、16バイトの固定ブロックサイズがあります。 PKCS 5/7パディングを使用すると仮定すると、この式を使用して、

 cipherLen = (clearLen/16 + 1) * 16;

クリアテキストがブロックサイズの倍数である場合、パディングにはまったく新しいブロックが必要であることに注意してください。平文は16バイトだとしましょう。暗号テキストは32バイトかかります。

IV(初期ベクトル)を暗号テキストとともに保存することができます。その場合、IVに16バイトを追加する必要があります。

80
ZZ Coder

ブロック暗号としてのAESは、サイズを変更しません。入力サイズは常に出力サイズです。

ただし、ブロック暗号であるAESでは、入力がブロックサイズ(16バイト)の倍数である必要があります。このため、一般的な PKCS5 と同様に、パディングスキームが使用されます。したがって、答えは、暗号化されたデータのサイズは使用されるパディング方式に依存するということです。しかし同時にall既知のパディング方式は次のモジュールの16サイズに切り上げられます(サイズAESのブロックサイズは16バイトです)。

31
Remus Rusanu

AESを使用するモードによって異なります。持っているものは、ECBやCBCなど、ほとんどのブロック指向モードで正確です。 OTOH、CFBモード(一例)では、基本的にAESを使用してバイトストリームを生成します。これは、入力のバイトでXOR。出力は、上記のように次のブロックサイズに切り上げられるのではなく、入力のサイズのままにすることができます。

8
Jerry Coffin
5
Zaf

AES暗号は常に16バイト(128ビット)ブロックで機能します。入力バイト数が16の正確な倍数でない場合は、パディングされます。 16が計算の「マジックナンバー」のように見えるのはそのためです。あなたが持っているものはすべての入力サイズで動作するはずです。

3
In silico

AESは128ビット(16バイト)ブロックで動作し、クリアテキストブロックを同じ長さの暗号テキストブロックに変換します。 16バイトより短い場合、最後のブロックにパディングが行われるため、式は正しく見えます。

1
wRAR

入力長がintの最大サイズより小さい場合は、 Cipher.getOutputSize(int) を使用できます

0
ed22