it-swarm.com.de

Datengröße nach AES / CBC- und AES / ECB-Verschlüsselung

Ich möchte die Größe der Daten nach der AES-Verschlüsselung kennen, damit ich vermeiden kann, meine Post-AES-Daten (auf der Festplatte oder im Speicher) zu puffern, hauptsächlich, um die Größe zu kennen.

Ich benutze 128 Bit AES und javax.crypto.Cipher und javax.crypto.CipherInputStream für die Verschlüsselung.

Einige Tests, die mit verschiedenen Eingabegrößen durchgeführt wurden, haben gezeigt, dass die nachfolgend berechnete Post-Verschlüsselungsgröße korrekt ist:

long size = input_Size_In_Bytes; 
long post_AES_Size = size + (16 - (size % 16));

Ich bin mir aber nicht sicher, ob die obige Formel für alle möglichen Eingabegrößen gilt.

Gibt es eine Möglichkeit, die Datengröße nach der Anwendung der AES-Verschlüsselung zu berechnen - im Voraus, ohne die verschlüsselten Daten (auf der Festplatte oder im Speicher) zwischenzuspeichern, um die Größe nach der Verschlüsselung zu ermitteln?

58
Ramson Tutte

AES hat eine feste Blockgröße von 16 Byte, unabhängig von der Schlüsselgröße. Angenommen, Sie verwenden PKCS 5/7 Padding, verwenden Sie diese Formel,

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

Bitte beachten Sie, dass wenn der Klartext ein Vielfaches der Blockgröße ist, ein ganz neuer Block zum Auffüllen benötigt wird. Angenommen, Sie Klartext ist 16 Bytes. Der Chiffretext benötigt 32 Bytes.

Möglicherweise möchten Sie IV (Initial Vector) mit Chiffretext speichern. In diesem Fall müssen Sie für IV 16 weitere Bytes hinzufügen.

80
ZZ Coder

AES als Blockchiffre ändert die Größe nicht. Die Eingabegröße ist immer die Ausgabegröße.

Da AES eine Blockverschlüsselung ist, muss die Eingabe jedoch ein Vielfaches der Blockgröße (16 Byte) betragen. Hierfür werden Auffüllschemata wie das beliebte PKCS5 verwendet. Die Antwort lautet also, dass die Größe Ihrer verschlüsselten Daten vom verwendeten Füllschema abhängt. Gleichzeitig werden all bekannte Auffüllschemata auf die nächste Modulgröße 16 aufgerundet (Größe AES hat eine Blockgröße von 16 Bytes).

31
Remus Rusanu

Dies hängt von dem Modus ab, in dem Sie AES verwenden. Was Sie haben, ist für die meisten blockorientierten Modi wie EZB und CBC genau. OTOH, im CFB-Modus (zum Beispiel) verwenden Sie im Grunde nur AES, um einen Bytestrom zu erzeugen, den Sie XOR mit Bytes der Eingabe. In diesem Fall die Größe des output kann die Größe der Eingabe beibehalten, anstatt wie oben angegeben auf die nächste Blockgröße aufgerundet zu werden.

8
Jerry Coffin
5
Zaf

Die AES-Verschlüsselung funktioniert immer mit 16-Byte-Blöcken (128-Bit). Wenn die Anzahl der Eingabebytes kein genaues Vielfaches von 16 ist, wird sie aufgefüllt. Aus diesem Grund scheint 16 die "magische Zahl" in Ihrer Berechnung zu sein. Was Sie haben, sollte für alle Eingabegrößen funktionieren.

3
In silico

AES arbeitet in 128-Bit-Blöcken (16 Byte) und konvertiert Klartextblöcke in Chiffretextblöcke gleicher Länge. Der letzte Block wird aufgefüllt, wenn er kürzer als 16 Byte ist, damit Ihre Formel korrekt aussieht.

1
wRAR

Wenn Ihre Eingabelänge kleiner als die maximale Größe von int ist, können Sie Cipher.getOutputSize (int) verwenden

0
ed22