23. November 2003
Wie funktioniert das?


Rückgekoppelte Schieberegister

Anders als bei den klassischen Blockchiffren wie DES oder Rijndael, bei denen immer jeweils ein Block in mehreren Durchläufen verwürfelt wird, handelt es sich hierbei um ein Stromchiffre. Das zentrale Element ist ein Zufallsgenerator, der ein reproduzierbares "Rauschen" erzeugt, welches dem Klartext byteweise aufaddiert wird. Dieser Byte-Strom, hat gute statistische Eigenschaften (im Schnitt genau so viele Nullen wie Einsen). Die zugrundeliegende mathematische Polynomdivision wird technisch mit mehrfach rückgekoppelten Schieberegistern realisiert.

Ein einzelnes Schieberegister reicht aber nicht aus, weil dessen Generatorpolynom ganz schnell bestimmt werden kann, hat man nur ein paar Bits der Folge verläßlich erkannt.

Zufallsgenerator

Deshalb bilden zwei gegensinnig umlaufende Register (31 bit und 33 bit) die Summanden für eine Modulo-2-Addition (XOR). Ein drittes Register (64 bit) entscheidet, ob der Funktionswert gültig ist oder verworfen wird.

Butt

31-bit-Register

Dieses Register hat eine Umlauflänge von 2^31-1 = 2147483647. Das ist eine Primzahl die garantiert, daß alle Folgemaßnahmen diese Länge vervielfachen und sich nicht durch zufällig erwischte Teiler kurze Zyklen wiederholen.

Der Schlüssel wählt ein Rückkopplungspolynom aus einer Liste primitiver Polynome aus. Diese Polynome sind alle irreduzibel. Jeder Wert des Registers liegt damit auf dem großen Zyklus.

33-bit-Register

Das Rückkopplungspolynom für dieses Register wird direkt vom Schlüssel abgeleitet. Das heißt, daß sich hier nur zufällig ein Maximalzyklus ergibt. Die Umlaufsequenzen können sehr viel kürzer sein aber das weiß man nicht.

Der Vorteil besteht darin, daß das Polynom, welches die Sequenz bestimmt, unbekannt ist und auch nicht vorhergesagt werden kann. 2147483648 verschiedene Polynome sind in der aktuellen Implementierung möglich.

64-bit-Register und Butt

Dieses Register wird genau wie das 33-bit-Register mit einem zufälligen Polynom betrieben, welches direkt vom Schlüssel abgeleitet wird. Aus Performance-Gründen ist die Anzahl der möglichen Polynome ebenfalls auf 2147483648 beschränkt.

Während das Register umläuft, greift ein "Kolben" ins Getriebe und fühlt den Inhalt von zwei zufällig ausgewählten Bits ab. Nur wenn diese beiden Bits Null sind, wird die oben berechnete Verknüpfung von 31-bit- und 33-bit-Register als Funktionswert ausgegeben. Im Durchschnitt werden also 3/4 aller Werte verworfen (manchmal nur die Hälfte, aber wann, das weiß man wieder nicht). Der Butt kann so nochmal 528 unterschiedliche Untersequenzen auswählen.

Schlüsselgenerierung mit MD5

Aus der eingegebenen Passphrase berechnet der MD5-Algorithmus eine 128-bit-Zahl, also 16 byte. Diese initialisieren die Startwerte für die umlaufenden Schieberegister. Anschließend wird der Key noch einmal durch den MD5-Algorithmus geschickt und die Rückkopplungspolynome davon abgeleitet.

ASCII-Kompression und Base64-Kodierung

Der Klartext ist reiner ASCII-Text. Um nicht jedes achte Bit der Schlüsselsequenz zu verraten, werden die ASCII-Bytes vor der Verschlüsselung auf 7 bit zusammengeschoben und nach der Entschlüsselung wieder expandiert.

Verschlüsselung

Der verschlüsselte Bytestrom muß noch in sein Trägermedium integriert werden, nämlich in eine html-Seite. Das geht aber so roh nicht, weil alle Zeichen im Wertevorrat von 128 bis 255 nicht zum ASCII-Code gehören und selbst im unteren Bereich Sonderzeichen umkodiert oder Dos2Unix oder sonstwas gewandelt werden könnten. Deshalb wird der Bytestrom nochmal 6-bit-weise zerstückelt und mit den in allen ASCII-Codes der Welt einheitlichen Buchstaben und Ziffern kodiert (Base64). Dieser Block in einer html-Seite sollte von keiner Code-Umrechnung verunstaltet werden.