Folgendes bezieht sich auf eine von mir geschriebene Version von BLOWFISH. Sie ist verfügbar unter: http://www.s-direktnet.de/homepages/neumann/crypt/de/index.html. Schauen Sie unter der Kategorie Algortihmen, dann unter BLOWFISH und laden Sie Blowfish.cpp herunter. Wenn Sie Kommentare oder Fragen haben, setzten Sie sich bitte mit mir in Verbindung: neumann@s-direktnet.de
Die Anzahl der Runden ist normalerweise 16 und die Blocklänge beträgt 64 Bit. Es gibt aber andere Versionen von BLOWFISH (z. B. Mini-Blowfish), bei denen die Blocklänge und die Anzahl der Runden anders ist.
Wenn Sie die Anzahl der Runden ändern wollen, dann müssen Sie folgendes tun:
Definieren Sie nicht "#define FAST" - benutzen Sie
keine Makros!
Ändern Sie den Quellcode wie folgt (Änderungen sind grün):
void Blowfish_encryptBlock(ULONG& xl, ULONG& xr) {
ULONG temp;
for(int i=0; i<NUMBER_OF_ROUNDS; ++i) {
xl ^= PArray[i];
xr ^= F(xl);
temp = xl; xl = xr; xr = temp;
}
temp = xl; xl = xr; xr = temp;
xr ^= PArray[NUMBER_OF_ROUNDS];
xl ^= PArray[NUMBER_OF_ROUNDS+1];
}
void Blowfish_decryptBlock(ULONG& xl, ULONG& xr) {
ULONG temp;
for(int i=NUMBER_OF_ROUNDS+1; i>1; --i) {
xl ^= PArray[i];
xr ^= F(xl);
temp = xl; xl = xr; xr = temp;
}
temp = xl; xl = xr; xr = temp;
xr ^= PArray[1];
xl ^= PArray[0];
}
ULONG PArray[NUMBER_OF_ROUNDS+2], initial_PArray[NUMBER_OF_ROUNDS+2] = { /* see below */ }
|
Das Array "initial_PArray" muß gefüllt werden!!
"initial_SBoxes" und "initial_PArray" werden
mit den Dezimalstellen der Zahl PI gefüllt, es können aber auch
Zufallszahlen oder jede nicht-periodische Zahl dafür verwendet
werden.
In "Blowfish_init" müssen alle Vorkommnisse von "18" (die Länge von initial_PArray bei einer Rundenzahl von 16) in NUMBER_OF_ROUND+2 geändert werden:
for(i=0; i<NUMBER_OF_ROUNDS+2; ++i) {
// generate from string "key" 32-bit keys
val = 0;
for(j=0; j<4; ++j) {
val = (val << 8) | key[keypos++];
if(keypos >= keylen) keypos=0;
}
PArray[i] = initial_PArray[i] ^ val;
}
data.l = data.r = 0;
for(i=0; i<NUMBER_OF_ROUNDS+2; i+=2) {
Blowfish_encryptBlock(data.l,data.r);
PArray[i] = data.l;
PArray[i+1] = data.r;
}
|
Das ist alles!
Die Blocklänge beträgt normalerweise 64 Bits!
Dies kann jedoch in 32 Bit oder 128 Bit geändert werden (oder
sogar mehr).
Sie müssen nur ULONG in das was Sie wollen ändern, z. B. in "unsigned short" oder einem Typ, der 128 Bit lang ist. Dann jedoch müssen Sie "initial_PArray" und "intitial_SBoxes" ändern. Füllen Sie diese mit "unsigned short"s (oder 128-Bit Werte) von der Zahl PI oder etwas anderem (siehe oben).
Michael Neumann, 05.06.1999, Germany