in English auf Deutsch

Erweitern von BLOWFISH

von Michael Neumann

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


Inhalt:

Allgemeines über BLOWFISH

Wie kann man die Anzahl der Runden ändern?

Wie kann man die Blocklänge ändern?


Allgemeines über BLOWFISH

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.


Wie kann man die Anzahl der Runden ändern?

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!


Wie kann man die Blocklänge ändern?

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