it-swarm.com.de

AES CBC-Auffüllung, wenn die Nachrichtenlänge ein Vielfaches der Blockgröße beträgt

Unter der Annahme, dass ein 32-Byte-Klartext von AES 128 CBC verschlüsselt wird, muss gemäß den verschiedenen Auffüllschemata eine 16-Byte-Auffüllung hinzugefügt werden?

21
moti

Das Auffüllen ist eine Möglichkeit, Nachrichten mit einer Größe zu verschlüsseln, die die Blockverschlüsselung sonst nicht entschlüsseln könnte. Es ist eine Konvention zwischen dem, der verschlüsselt und dem, der entschlüsselt. Wenn Ihre Eingabenachrichten immer eine Länge haben, die mit Ihrem Verschlüsselungsmodus verarbeitet werden kann (z. B. haben Ihre Nachrichten immer ein Längenmultiplikator von 16), müssen Sie keine Auffüllung hinzufügen - , solange Während der Entschlüsselung versuchen Sie nicht, nach einer Polsterung zu suchen, wenn keine vorhanden ist. Wenn einige Ihrer Nachrichten aufgefüllt werden müssen, müssen Sie systematisch eine Art Auffüllen hinzufügen, da sonst die Entschlüsselung nicht eindeutig ist.

Das Auffüllen erhöht die Sicherheit nicht. Schlecht implementiertes Padding Management kann Informationen verlieren ( Padding Orakel ), daher müssen Sie bei Ihrer Implementierung vorsichtig sein - vorzugsweise nicht mach es selbst.

(Natürlich ist es besser, wenn Sie einen Verschlüsselungsmodus verwenden, für den keine Auffüllung erforderlich ist und die dringend benötigte, aber häufig übersehene Integritätsprüfung enthält Mittelwert GCM oder EAX , nicht CBC.)

21
Thomas Pornin

Es hängt alles davon ab, was Sie verschlüsseln. Wenn Sie Daten verschlüsseln, die immer eine Länge von 32 Byte (oder ein Vielfaches der Blockgröße) haben, müssen Sie überhaupt kein Auffüllen verwenden.

Wenn der Klartext eine beliebige Länge hat, müssen Sie Ihren Text auffüllen und einen Mechanismus verwenden, um die Daten beim Entschlüsseln vom Auffüllen zu trennen.

Angenommen, Sie verwenden ein Auffüllschema, in dem Sie mit 01 auffüllen, wenn ein Byte fehlt, mit 02 02, wenn 2 Bytes fehlen, und so weiter.

Sie müssen auch eine Auffüllung für 16-Byte-Text hinzufügen, da sonst, wenn Sie einen Text wie entschlüsseln

01 02 03 05 06 01 02 03 05 06 06 01

sie könnten nicht wissen, ob dies ein 15-Byte-Text ist:

01 02 03 05 06 01 02 03 05 06 06 + 01

auffüllen eines 16-Byte-Textes, der nicht aufgefüllt wurde:

01 02 03 05 06 01 02 03 05 06 06 01

.

Das obige Problem wird gelöst, indem Sie wissen, dass Sie Ihre Daten unabhängig von der Länge immer auffüllen.

7
Dinu

Es ist nicht "obligatorisch", einer Nachricht, die ein Vielfaches der Blockgröße beträgt, Auffüllungen hinzuzufügen, aber die meisten Implementierungen tun dies. Das Auffüllen von PKCS # 5 schreibt das Hinzufügen eines Byteblocks vor, der alle auf Null gesetzt ist, um dem Algorithmus mitzuteilen, dass tatsächlich alle übertragenen Blöcke vorhanden sind. Dies ist hilfreich, wenn die Implementierung aufgefordert werden könnte, alles beliebiger Länge zu verschlüsseln und über eine "unzuverlässige" Transportmethode zu senden. Wenn Sie eine Kommunikationsschicht verwenden, die über eine eigene Fehlerprüfung verfügt, z. B. TCP, und wenn Sie wissen, dass die ungepolsterte Nachricht immer ein genaues Vielfaches der verwendeten Blockgröße ist, ist sie redundant.

2
KeithS