Home > Kryptographie > Betriebsmodi

Kryptographie

7. Betriebsmodi

In diesem Kapitel geht es um die verschiedenen Arten und Weisen, wie ein kryptographischer Algorithmus eingesetzt werden kann.

Electronic-Codebook-Modus (ECB)

Dies ist der einfachste Modus. Wir "füttern" den Algorithmus einfach mit einem Block bestimmter Länge, und fertig. Wir haben z. B. den Text:

Hallo Leute wie geht's?
Diesen Text wollen wir nun verschlüsseln, z. B. mit DES. DES verschlüsselt immer einen Block der Länge 64 Bit (= 8 Bytes oder Zeichen). Wir fassen nun den 23 Zeichen langen Text in Blöcke zusammen ("_" symbolisiert ein Leerzeichen):
Block 1: Hallo_Le (8 Zeichen)
Block 2: ute_wie_ (8 Zeichen)
Block 3: geht's?  (7 Zeichen)

Sie sehen, dass Block 3 nur aus 7 Zeichen besteht. Da wir jedoch 8 Zeichen brauchen, müssen wir den Block irgendwie auffüllen. Dieses Auffüllen nennt man auch Padding. Man kann z. B. mit binären Nullen oder Einsen auffüllen oder Zufallsbytes verwenden. Allerdings müssen wir ja bei der Entschlüsselung erfahren, wie lang nun der letzte Block wirklich ist. Dazu setzen wir das letzte Byte des Blocks auf die eigentliche Länge des Blocks. In unserem Fall benötigen wir also gar kein Padding, sondern hängen Block 3, also dem letzten Block, einfach die binäre Darstellung der Zahl 7 an. Bei der Entschlüsselung entschlüsseln wir zunächst den letzten Block, benutzen aber nur die Anzahl von Bytes, die wir im letzten Byte des Blocks gespeichert haben. Unglücklicherweise müssen wir auch dann auffüllen, wenn der Klartext an der Blockgrenze endet. Dann muss ein ganz neuer Block angehängt werden, der aus Auffüll-Bytes besteht und dessen letztes Byte 0 ist.

In mathematischer Notation sieht ECB wie folgt aus:

Verschlüsselung:

Ci = EK(Pi)

Entschlüsselung:

Pi = DK(Ci)

P = Klartextblock, C = Chiffretextblock, E = Verschlüsselungsfunktion, D = Entschlüsselungsfunktion, K = aktueller Schlüssel, i = Index der Klartext- bzw. Chiffretextblöcke. Wie Sie sehen werden also nur die Blöcke ver- bzw. entschlüsselt – und mehr auch nicht.

Der ECB-Modus wird recht selten verwendet, da bei diesem Modus gleiche Blöcke immer zu gleichen Chiffreblöcken verschlüsselt werden. Der Modus ist daher allenfalls für Datenbank-Einträge oder solche Daten geeignet, die keine oder wenige Muster aufweisen; auf keinen Fall jedoch für längere Texte bzw. Dateien (Muster im Klartext werden nicht verborgen!). Außerdem kann die sog. Block-Replay-Attacke darauf angewendet werden.

Wie im ECB-Modus muss auch in allen anderen Modi aufgefüllt werden, sofern blockweise (d. h. mit Blöcken größer als 1 Byte) verschlüsselt wird. Wird die eigentliche Länge des letzten Blocks anderweitig gespeichert (z. B. am Anfang des Chiffretextes in Form der Originallänge des Klartextes), ist das Padding freilich nicht mehr notwendig.

Cipher-Block-Chaining (CBC)

Viel beliebter hingegen ist der sog. CBC-Modus. Bei diesem Modus fließt das Ergebnis der Verschlüsselung früherer Blöcke in die Verschlüsselung des aktuellen Blocks mit ein. Das Ganze funktioniert folgendermaßen: Bevor ein Klartextblock verschlüsselt wird, wird er mit dem vorherigen Chiffretextblock xor-verknüpft. Die Chiffretextblöcke werden in einem sog. Rückkopplungsregister gespeichert, mit dem dann der nächste Klartextblock xor't wird. Der erhaltene neue Chiffretextblock wird wieder gespeichert usw.

Um im CBC-Modus zu entschlüsseln, entschlüsselt man einen Chiffretextblock ganz normal und speichert ihn in einem Rückkopplungsregister. Nachdem der nächste Block entschlüsselt wurde, wird er mit dem Inhalt des Registers xor-verknüpft. Dann wird der nächste Block im Rückkopplungsregister gespeichert usw. Mathematisch ausgedrückt:

Verschlüsselung:

Ci = EK(Pi xor Ci − 1)

Entschlüsselung:

Pi = Ci − 1 xor DK(Ci)

Initialisierungs-Vektor

Wenn wir den ersten Block P1 verschlüsseln wollen, benötigen wir den vorherigen Chiffretextblock C0. Da wir keinen solchen Chiffretextblock zur Verfügung haben, müssen wir uns irgendwie einen besorgen, einen Pseudo-Block oder Dummy-Block. Diesen erzeugen wir am besten mit Hilfe eines Zufallsgenerators. Dieser Block von Zufallsdaten heißt Initialisierungs-Vektor (IV). Natürlich müssen wir ihn speichern, damit wir später wieder entschlüsseln können (wir dürfen ihn ruhig unverschlüsselt speichern, der IV bietet dem Angreifer keinen Angriffspunkt). Durch Verwendung eines IVs haben wir erreicht, dass gleiche Klartexte zu unterschiedlichen Chiffretexten verschlüsselt werden. Dadurch können wir einige gefährliche Attacken abwehren. Salt ist auch eine Art von Initialisierungs-Vektor.

Cipher-Feedback-Modus (CFB)

In manchen Fällen können Daten nicht blockweise, sondern nur byteweise verschlüsselt werden. Zum Beispiel befinden wir uns in einer sicheren Netzwerkumgebung und wollen jedes eingetippte Zeichen sofort zum Host übertragen – verschlüsselt, versteht sich! An dieser Stelle ist CBC ungeeignet, da wir ja erst auf einen ganzen Block warten müssen, bis die Verschlüsselung beginnen kann. Man könnte in diesem Fall auch eine Stromchiffrierung verwenden, aber wir wollen nun mal eine Blockchiffrierung im CFB-Modus betreiben. Und das funktioniert so: Ein Blockalgorithmus, wie z. B. DES, arbeitet mit einer Warteschlange der Größe eines Blocks, z. B. 64 Bit oder 8 Bytes. Am Anfang erhält die Warteschlange wie im CBC-Modus einen IV. Die Warteschlange wird verschlüsselt und die acht Bit, die im Ergebnis ganz links stehen, werden mit den ersten acht Bit des Klartextes xor-verknüpft. Diese acht Bits des Chiffretextes werden auf die acht Bitpositionen ganz rechts rechts in der Warteschlange verschoben, alle anderen Bits werden um acht Positionen nach links verschoben. Die acht Bits ganz links werden nicht mehr benötigt. Und so weiter. Zur Entschlüsselung läuft der umgekehrte Prozess ab, allerdings wird auch hier der Algorithmus im Verschlüsselungs-Modus benutzt, da die eigentliche Verschlüsselung ja aus der xor-Verknüpfung besteht und xor umkehrbar ist. Zur Veranschaulichung hier eine Abbildung:

Beschreibung des CFB-Modus

wobei k ein Byte des Schlüsselstroms, p das Klartextbyte und c das Chiffretextbyte ist. Der Kreis mit dem "+" darin bedeutet übrigens "xor". Das "Byte ganz links" fungiert hierbei als Schlüsselbyte k, daher p xor k = c.

Neben 8-Bit CFB sind auch 16-Bit- oder 32-Bit-CFB möglich, sogar 1-Bit-CFB! Grundsätzlich ist n-Bit-CFB möglich, wobei n kleiner oder gleich der Blockgröße des Algorithmus ist. Ist n gleich der Blocklänge des Algorithmus, sehen Ver- bzw. Entschlüsselung wie folgt aus:

Ci = Pi xor EK(Ci − 1)
Pi = Ci xor EK(Ci − 1)

wobei K der aktuelle Schlüssel ist.

Output-Feedback-Modus (OFB)

Dieser Modus ähnelt dem CFB-Modus, nur wird nicht das Chiffretextbyte c in die Warteschlange verschoben, sondern direkt das Schlüsselbyte k in der Warteschlange, welches auch für die Verschlüsselung von p verwendet wird. Sonst ist OFB identisch mit dem CFB-Modus. Zu beachten ist jetzt jedoch, dass der Strom von erzeugten Schlüsselbytes weder vom Klartextstrom noch vom Chiffretextstrom abhängt. Dies ist ein Problem, da man jetzt Angriffe durchführen kann, die wir im Kapitel über RC4 kennengelernt haben. Der Vorteil ist aber, dass man die gesamte benötigte Zufallssequenz schon im Voraus berechnen kann, da ja kein Klartext- bzw. Chiffretextbyte in die Warteschlange verschoben wird.

Auch OFB kann mit beliebig vielen Bits betrieben werden, wobei n wieder <= Blockgröße sein muss. Trotzdem haben Analysen ergeben, dass OFB nur eingesetzt werden sollte, wenn die Länge des Rückkopplungsregisters mit der Blockgröße übereinstimmt. Natürlich wird auch im OFB-Modus ein IV benötigt.

Ist n die Blocklänge des Algorithmus, sieht n-Bit-OFB folgendermaßen aus:

Ci = Pi xor Si; Si = EK(Si − 1)
Pi = Ci xor Si; Si = EK(Si − 1)

wobei Si einen Block des Schlüsselstroms darstellt. Wie deutlich zu erkennen ist, kann S schon im Voraus berechnet werden; S ist daher völlig unabhängig von C oder P. Die Nachricht muss lediglich mit diesem Schlüsselstrom xor-verknüpft werden.

Counter-Modus

Anstatt einen Klartextblock als Eingabe für die Blockchiffrierung zu verwenden, nimmt man einen Zähler (counter) als Eingabe. Nach jeder Verschlüsselung erhöht man den Zähler um einen bestimmten Wert, z. B. 1. Dieser Modus hat etwa die gleichen Eigenschaften wie OFB. Der Zähler muss aber nicht alle Werte der Reihe nach durchzählen, sondern kann auch beliebige Zufallszahlen verwenden. Der Vorteil des Counter-Modus ist, dass man den i-ten Schlüsselblock ki erzeugen kann, ohne dazu alle vorherigen Schlüsselblöcke generieren zu müssen. Der Zähler wird einfach auf den i-ten internen Zustand gesetzt und der gewünschte Block erzeugt, mit dem dann der Klartext xor-verknüpft wird.

Weitere Modi

Es gibt noch weitere Betriebsmodi, die aber fast alle dem CBC-Modus ähneln. Zum Beispiel Cipher Block Chaining mit Prüfsumme, CBCC: Dabei xor-verknüpft man alle Klartextblöcke miteinander und xor-verknüpft diesen Wert mit dem letzten Klartextblock. CBCC garantiert, dass jede Änderung eines Chiffretextblocks die entschlüsselte Ausgabe des letzten Blocks verändert. Es existieren noch viele andere Varianten, die sich aber alle nicht bewähren konnten.

Fazit

Bei ECB werden Muster im Klartext nicht verborgen; außerdem kann der Klartext leicht manipuliert werden, man kann Blöcke entfernen, wiederholen oder vertauschen. CBC ist die beliebteste Methode, da Muster im Klartext verborgen werden. Eine Manipulation des Klartexts ist umständlicher als bei ECB. CBC stellt die beste Lösung für Software-Produkte dar. CFB stellt normalerweise die beste Wahl zur Verschlüsselung von Zeichenströmen dar, wenn alle Zeichen einzeln behandelt werden müssen, z. B. bei einer Verbindung zwischen Terminal und Host. OFB wird meist für synchrone Hochgeschwindigkeitsverbindungen benutzt, bei denen Fehlerfortpflanzung nicht toleriert werden kann. OFB kommt außerdem zum Einsatz, wenn Vorausberechnungen nötig sind. Der Counter-Modus kann als Ersatz für OFB verwendet werden.