Der Verschlüsselungs-Algorithmus Blowfish wurde 1993 von Bruce Schneier entworfen und erstmals im April 1994 in Doctor Dobb's Journal publiziert. Blowfish ist ein sehr schneller und nicht patentierter Algorithmus, der besonders auf 32-Bit-Prozessoren eine exzellente Performance bietet. Ein weiterer Vorteil ist seine variable Schlüssellänge von 32 bis zu 448 Bit. Die Blockgröße beträgt 64 Bit und die Rundenzahl 16.
Es hat seitdem viele Kryptoanalysen von Blowfish gegeben und Serge Vaudenay fand ein paar schwache Schlüssel, die allerdings nur in Blowfish-Implementierungen mit 14 Runden oder geringer auftraten. Bis heute sind keine weiteren Schwächen bekannt.
Blowfish besitzt eine P-Box mit 18 mal 32 Bit und vier S-Boxen mit 256 mal 32 Bit zur Verschlüsselung. Die P- und die S-Boxen sind fest implementiert. Sie enthalten die Zahl pi als Hexadezimalwert (siehe Links).
Der Algorithmus wird mit Hilfe des Schlüssels initialisiert, dazu später mehr.
Zur Verschlüsselung werden die eingehenden 64 Bit in zwei Blöcke zu je 32 Bit, L und R aufgeteilt. Danach läuft folgende Prozedur durch:
für i von 0 bis <16
- L = L xor P[An der Stelle i]
- R = R xor f(Argument L)
- vertausche L und R
Anschließend:
- vertausche L und R
- L = L xor P[An der Stelle 16]
- R = R xor P[An der Stelle 17]
Die Entschlüsselung sieht wie folgt aus:
Für i von 17 bis >1
- L = L xor P[An der Stelle i]
- R = R xor f(Argument L)
- vertausche L und R
Anschließend:
- vertausche L und R
- L = L xor P[An der Stelle 1]
- R = R xor P[An der Stelle 0]
Nun steht nur noch die Funktion f offen: Der eingehende 32 Bit-Wert wird in vier Teile zu je 8 Bit aufgeteilt: a,b,c,d. Danach wird aus den S-Boxen mithilfe dieser Werte je ein Wert entnommen und diese dann addiert und xor-Verknüpft.
Die Funktion gibt dann zurück: ((S-Box1[a] + S-Box2[b] MOD 2^32) XOR S-Box3[c]) + S-Box4[d] MOD 2^32
Zur Entschlüsselung läuft die gesamte Prozedur rückwärts durch. Dazu werden die Runden dann auch von 16 auf 0 gezählt.
Der Algorithmus wird mit Hilfe des Schlüssels initialisiert, dazu benötigt man aber den oben erwähnten Verschlüsselungsalgorithmus.
Zuerst wird der Schlüssel in 32 Bit-Blöcke aufgeteilt. Danach wird jeder Eintrag der P-Box mit den 32 Bit-Blöcken des Schlüssels xor-verknüpft. Dabei wechseln sich die Blöcke des Schlüssels nacheinander ab. Danach wird ein Block mit 64 Nullbits verschlüsselt. Die linke und rechte Hälfte ersetzen dabei den ersten und zweiten Eintrag der P-Box. Dann wird mit dem aktuellen Stand der Geheimtext aus dem letzten Schritt verschlüsselt, und der dritte und vierte Eintrag der P-Box wird ersetzt. Dieses passiert solange, bis alle Einträge der P-Box und der vier S-Boxen ersetzt wurden.