Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DE

  Alt 19. Aug 2004, 10:30
in deinem Falle wäre das
Delphi-Quellcode:
  
  
var
  Input, Output, Password, IV: String;
begin
  IV := '12345678';
  Password := 'schluessel';
  Input := 'Was zu verschlüsseln war.';
  with TCipher_Blowfish.Create('', nil) do
  try
    Mode := cmCFB;
    Init(Password[1], Length(Password), Pointer(IV));
    Output := EncodeString(Input);
  finally
    Free;
  end;
  Output := StrToFormat(PChar(Input), -1, fmtHEX);
end;
WICHTIG! dabei ist aber das Lenght(IV) = Cipher.BlockSize ist. Und ansonsten sieht alles schon sehr richtig aus.
Desweiteren solltest du nachschauen was PHP unter dem CFB Mode versteht. Es gibt nämlich da sehr viele verschiedene Cipher Modis die sich CFB schimpfen aber denoch unterschiedlich sind.
Als erstes verschlüsselst du mal im ECB Mode einen festen Text. Den binären und unformatierten Outpu vom PHP zum DEC vergleichst du. Nungut ich weis aber jetzt schon das DEC zum PHP in diesem Punkt kompatibel ist.
Als nächstes obige Routine aber OHNE das StrToFormat(), eg. echo base64_encode($encrypted_data); im PHP die beiden binären Output vergleichen. Wenn diese auch übereinstimmen dann mit der MIME64 Formatierung ausprobieren.
.InitKey() kannst du nicht verwenden, da diese Methode dein übergebenes Passwort per Hash-Funktion in einen sicheren Session Key umwandelt. Nun, das macht PHP natürlich nicht so. Du musst also immer .Init() verwenden wenn man kompatibel bleiben will.

Achso: bei Blowfisch gibt es auf Grund fehlender Beschreibungen zum Algo. durch B.Schneier eine Unklarheit ob der Algo. in Big oder Little Endian arbeitet. Da das nun Interpretationsfrage der Programmierer wurde gibt es sozusagen 2 verschiedene Versionen vom Blowfish die technisch gesehen aber identisch sind. Denoch sind beide Versionen untereinander inkompatibel.

Gruß Hagen

PS: auch DEC verwendet einen Standard-IV falls dieser beim .Init(.., nil) mit nil angegeben wurde. Allerdings ist die verwendete Methode nirgends standardisiert und unterscheidet sich ganz gewisse von der in PHP. Im DEC wird der IV=00000000000 verwednet der aber zusätzliche mit sich selber verschlüsselt wird. D.h. nur mit richtigem Passwort erzeugt man den gleichen internen IV. Im PHP wird dagegen der IV binär 1 zu 1 verwendet.
  Mit Zitat antworten Zitat