Feistel-Netzwerke

Feistel-Netzwerke sind die Grundlage vieler moderner Blockchiffren; sie werden z.B. in DES, Blowfish, Twofish, CAST, FEAL, MARS, Khufu, Khafre, LOKI, GOST u.a. verwendet. Das Konzept wurde von dem IBM-Mitarbeiter Horst Feistel entwickelt. Das Prinzip ist sehr einfach:

Der Eingabetext wird zunächst in gleich große Verschlüsselungsblocks aufgeteilt (oft z.B. 64 Bit; in diesem Programm sind es der Übersichtlichkeit halber nur 32 Bit). Jeder Block wird dann noch einmal in zwei gleich große Hälften L und R geteilt. Die Chiffrierung erfolgt dann iterativ in mehreren Runden, indem die Ausgabe der (i+1)-ten Runde durch die der i-ten Runde bestimmt wird. Hierbei wird jeweils der rechte und linke Block getauscht; der rechte Block aus Runde (i-1) wird zum linken Block in Runde i, der linke Block aus der Runde (i-1) wird in der Runde i zum rechten Block. Der rechte Block (und nur dieser!) wird zusätzlich mit einem Wert XOR-verknüpft, der aus dem aktuellen Rundenschlüssel und der rechten Hälfte der Runde (i-1) (die nun in die linke Hälfte gewandert ist), mittels einer algorithmusspezifischen nichtlinearen Funktion f(R,K) gewonnen wird:

   Li = Ri-1
   Ri = Li-1 ⊕ f(Ri-1,Ki)
wobei ⊕ den XOR-Operator bezeichnet, f(R,K) eine beliebige (nichtlineare) Funktion ist und Ki der Rundenschlüssel der i-ten Runde ist; dieser wird vor der Verschlüsselung aus dem vorgegebenen Schlüssel berechnet.

Der große Vorteil von Feistel-Netzwerken ist, daß die Funktion f(R,K) beliebig kompliziert sein kann; sie muß (zur Dechiffrierung) nicht einmal umkehrbar sein. Man nutzt einfach die Tatsache, daß eine zweimal angewandte XOR-Verknüpfung wieder den urspünglichen Wert ergibt:

   Ri-1 = Li
   Li-1 = Ri ⊕ f(Ri-1,Ki) =  Ri ⊕ f(Li,Ki)

Für die praktische Realisierung bietet es sich an, bei der Dechiffrierung vor und nach der Operation den linken und rechten Block zu vertauschen. Dann lässt sich die Chiffrierungs-Routine auch für die Dechiffrierung benutzen, indem einfach die Reihenfolge der Rundenschlüssel invertiert wird.

In diesem Skript wird sowohl für die Rundenfunktion als auch für die Schlüsselfunktion ein Polynom 8. Grades benutzt. Die Funktionen sind willkürlich gewählt; es könnte auch eine beliebige andere Funktion benutzt werden. Bei der Rundenfunktion f(R,K) ist nur wichtig, daß sie (nicht zu schwach) nichtlinear ist, da die Sicherheit des Algorithmus durch die Wahl dieser Funktion bestimmt wird.

Es ist möglich, sich die Differenz zur letzten Ein- bzw. Ausgabe zeigen zu lassen. Die Differenz ist dabei definiert als XOR-Verknüpfung zwischen den beiden Werten; d.h., an allen Stellen, an denen sich ein Bit geändert hat, wird das Differenzbit gesetzt.

Die Eingabe kann wahlweise als Zahl oder als Bitmaske (mit den Checkboxen) erfolgen. Zur besseren Übersicht können die Eingabefelder und die Einleitung ausgeblendet werden.


Eingabe (Hex-Zahl):     
Schlüssel (Hex-Zahl):
Anzahl Runden:
Rundenfunktion:f = * (Ki*Li)8 + * (Ki*Li)6 + * (Ki*Li)4 + * (Ki*Li)2 + mod 65537
Schlüsselfunktion:Ki+1 = * Ki8 + * Ki6 + * Ki4 + * Ki2 + mod 65521

  ausführliche Ausgaben      Differenzen anzeigen      Eingabefelder ausblenden      Einführung ausblenden

Zurück zur Hauptseite