Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Blowfish-Verschlüsslung - Kompatiblität zu C++
Flamefire - Di 13.01.09 17:03
Titel: Blowfish-Verschlüsslung - Kompatiblität zu C++
Ich bin dabei einen Code von C++ nach Delphi zu portieren. Da ist auch der Blowfish-Algo dabei.
Bisher habe ich TDCP_*-Kompos verwendet, aber bei der Portierung scheint das nicht zu funktionieren.
Hier mal die Ausschnitte aus dem QuellCode:
Original:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| keyArray[0] = xxx; keyArray[1] = yyy;
blowfish.Initialize((LPBYTE)keyArray, 8);
keyArray2[0] = zz; keyArray2[1] = zzzz;
blowfish.Encode((LPBYTE)keyArray2, (LPBYTE)keyArray2, 8); |
und meine Portierung;
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| PCardinal(@BFKey[0])^:=xxx; PCardinal(@BFKey[4])^:=yyy; Form1.DCP_bf.Init(BFKey[0],8*8,nil); PCardinal(@BFKey[0])^:=zz; PCardinal(@BFKey[4])^:=zzzz; Form1.DCP_bf.EncryptCBC(BFKey,BFKey,8); |
BFKey ist ein 8-Byte Array
Egal was ich mache: ich komme mit delphi auf ein anderes ergebnis nach der verschlüsselung als bei c++
Im Anhang mal der QuellCode des Original BF
Ist der vl modifiziert?
Bernhard Geyer - Di 13.01.09 23:03
Hast du die C++ und Delphi implementierung gegen offizielle Testvektoren
http://www.schneier.com/code/vectors.txt geprüft. Viele Implemetierung sind fehlerhaft und nur zu sich selbst kompatible.
Flamefire - Mi 14.01.09 10:23
ich habe diesen code im netz gefunden:
http://www.indetectables.net/foro/viewtopic.php?f=31&t=3367&p=19330
nach einer anpassung,dass der als key auch ein dynamisches bytearray nimmt, ist Blowfish_ECBEncipherBuf äquivalent zu Form1.DCP_bf.EncryptECB(BFKey,BFKey);
hab dann den c++ code in ein beispiel-projekt übernommen und mit nem key und daten gefüttert und mir das ergebnis ausgeben lassen
in delphi hab ich dann alle möglichen methoden der DCP-Kompo und der der neuen Unit getestet und mir ebenfalls ausgeben lassen
dabei ist mir aufgefallen, dass alle verschiedene ergebniss liefern (eigendlich logisch) und ebn Blowfish_ECBEncipherBuf äquivalent zu Form1.DCP_bf.EncryptECB ist
aber KEINER! gibt mir die gleichen ergebnisse wie der c++ code
also alles debuggt und geguckt, was dem am nächsten kommt:
ergebnis: Blowfish_ECBEncipherBuf
nach der schlüsselgenerierung ist alles identisch zum c++ part
aber die verschlüsselung ist anders:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| procedure Blowfish_ECBEncipherBuf( const Key: String; var Data; DataLen: Integer ); var buf: PChar; bufsize, i: Integer; xxl, xxr: DWORD; bf_P: bf_P_array; bf_S: bf_S_array; begin Blowfish_Initialize( Key, bf_P, bf_S );
bufsize := ( (DataLen + BLOCKSIZE - 1) div BLOCKSIZE ) * BLOCKSIZE; GetMem( buf, bufsize ); try FillChar( buf^, bufsize, 0 ); Move( Data, buf^, DataLen );
i := 0; while i<bufsize do begin Move( (buf+i )^, xxl, BLOCKSIZE div 2 ); Move( (buf+i+BLOCKSIZE div 2)^, xxr, BLOCKSIZE div 2 );
FlipEndian( xxl ); FlipEndian( xxr ); Blowfish_encipher( xxl, xxr, bf_P, bf_S ); FlipEndian( xxl ); FlipEndian( xxr );
Move( xxl, (buf+i )^, BLOCKSIZE div 2 ); Move( xxr, (buf+i+BLOCKSIZE div 2)^, BLOCKSIZE div 2 );
Inc( i, BLOCKSIZE ); end;
Move( buf^, Data, DataLen ) finally FreeMem( buf, bufsize ) end end; |
nach dem ich auch das abgeglichen habe, habe ich den Fehler gefunden: "FlipEndian"!
nachdem ich alle aufrufe dahin entfernt habe, bekam ich das selbe ergebnis!
kann das jemand erklären?
Sirke - Mi 14.01.09 11:56
Ich kenn die Funktion zwar nicht, würde aber darauf tippen, dass diese Funktion die Byte-Reihenfolge des 32-Bit-Wortes von Little-Endian auf Big-Endian und/oder umgekehrt ändert:
http://de.wikipedia.org/wiki/Byte-Reihenfolge
Klappt das dann damit jetzt? bzw. liefern beide die gleichen Ergebnisse?
Aber viel wichtiger ist, ob die Test-Vektoren auch richtig umgesetzt werden ;-)
Flamefire - Mi 14.01.09 19:47
ja es ist dasselbe ergebnis wie der c++-algo (hatte ich doch geschrieben, oder?)
ich weiß ja auch,was die funktion macht (endian und little/big endian byte order usw. sind mir begriffe da ich viel mit ollydbg arbeite)
die frage ist nur: warum muss das beim ECB sein, mit dem umdrehen wärenddessen es in der c++-variante nicht ist?
nja egal..
es geht ja
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!