![]() |
Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DEC)
Hallo Delphi Gemeinde!
Ich habe folgendes Problem, zu dem ich noch keine Lösung gefunden habe: Ich muss einen String mit PHP verschlüsseln und mit Delphi wieder entschlüsseln. Auf der PHP-Seite nutze ich die mcrypt-Erweiterung und folgenden Code:
Code:
Auf der Delphi-Seite arbeite ich mit der DEC-Komponente und diesem Code:
<?php
$key = "schluessel"; $input = "Was zu verschlüsseln war."; $encrypted_data = mcrypt_cfb (MCRYPT_BLOWFISH, $key, $input, MCRYPT_ENCRYPT, "12345678"); echo base64_encode($encrypted_data); ?>
Delphi-Quellcode:
Leider hatte ich damit keinen Erfolg. In meinen Augen liegt das Problem bei dem Initial Vektor (IV).
function decryptCode(encryptedCodeString: string);
var decryptedCodeString: string; IV: string; //IV: array[0..127] of Byte; begin IV := '12345678'; with TCipher_Blowfish.Create('', nil) do begin // Block-Modus setzen Mode := cmCFB; InitKey('schluessel', @IV); // Code entschlüsseln decryptedCodeString := CodeString(encryptedCodeString, paDecode, -1); end; ShowMessage(decryptedCodeString); end; Auf der PHP Seite ist er mehr oder weniger Pflicht (wenn man ihn nicht angibt, nimmt er einen Standardvektor (so hab ich es jedensfalls verstanden)). Aber wie ich diesen IV ("12345678") unter Delphi mit einbaue, ist mir nicht ganz klar. Ich habe mich zwar an dem DEC-Beispiel (IVDemo.pas) orientiert. Aber da ich relativ neu im Delphi-Bereich bin, kann es sein, dass ich da was übersehen habe. Ich würde mich über hilfreiche Beiträge freuen. Vielen Dank im Vorraus! Tobi |
Re: Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DE
in deinem Falle wäre das
Delphi-Quellcode:
WICHTIG! dabei ist aber das Lenght(IV) = Cipher.BlockSize ist. Und ansonsten sieht alles schon sehr richtig aus.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; 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. |
Re: Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DE
Hallo Hagen!
Vielen Dank für deine Hilfe! Jetzt klappt es. Sowohl mit Blowfish als auch im CFB-Modus. Hier nochmal die Lösung: Also String mit PHP-Skript (s.o.) verschlüsseln und mit folgender Funktion wieder entschlüsseln:
Delphi-Quellcode:
Der verschlüsselte String kommt als MIME64 codiert rein (so, wie er vom PHP-Skript rauskommt)
function decryptCode(encryptedCodeString: string);
var Output, Password, IV: String; begin IV := '12345678'; Password := 'schluessel'; with TCipher_Blowfish.Create('', nil) do try Mode := cmCFB; Init(Password[1], Length(Password), Pointer(IV)); Output := CodeString(encryptedCodeString, paDecode, -1); finally Free; end; end; und braucht auch nicht noch extra umgewandelt werden. Tobi |
Re: Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DE
Jo, du kannst auch mit den "High-Level" Methoden .CodeString() etc. arbeiten. Diese Konvertieren je nachdem ob paEncode/paDecode benutzt wird vor/nachher den String in/aus das ausgewählte Format. In deinem Falle mit -1 == fmtDefault wird das global definierte String Format benutzt. Standardmäßig eben fmtMIME64. Du solltest aber denoch daraüber nachdenken statt .CodeString(...., fmrDefault); eben direkt und explizit .CodeString(...., fmtMIME64) zu benutzen. (vermeidet unnötige Fehler für die Zukunft).
Benutzt du nun fmtCOPY als Format so wird einfach der Dateninhalt binär kopiert, also nicht formatiert. In DECUtil.DefaultStringFormat kannst du global das String Format benutzen das bei Angabe von fmtDEFAULT = -1 benutzt wird. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz