Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 13.01.09 17:03 
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:
ausblenden 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;
ausblenden 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?
Einloggen, um Attachments anzusehen!
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Di 13.01.09 23:03 
Hast du die C++ und Delphi implementierung gegen offizielle Testvektoren www.schneier.com/code/vectors.txt geprüft. Viele Implemetierung sind fehlerhaft und nur zu sich selbst kompatible.
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Mi 14.01.09 10:23 
ich habe diesen code im netz gefunden:
www.indetectables.ne...p;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:

ausblenden volle Höhe 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: Stringvar 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 - 1div 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 208
Erhaltene Danke: 2



BeitragVerfasst: 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:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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