AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DEC)
Thema durchsuchen
Ansicht
Themen-Optionen

Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DEC)

Ein Thema von sushiprinz · begonnen am 16. Aug 2004 · letzter Beitrag vom 19. Aug 2004
Antwort Antwort
sushiprinz

Registriert seit: 16. Aug 2004
3 Beiträge
 
Delphi 7 Professional
 
#1

Mit PHP verschlüsseln -> Mit Delphi entschlüsseln (DEC)

  Alt 16. Aug 2004, 07:32
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:
<?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);

?>
Auf der Delphi-Seite arbeite ich mit der DEC-Komponente und diesem Code:

Delphi-Quellcode:
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;
Leider hatte ich damit keinen Erfolg. In meinen Augen liegt das Problem bei dem Initial Vektor (IV).
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
  Mit Zitat antworten Zitat
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, 09: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
sushiprinz

Registriert seit: 16. Aug 2004
3 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 19. Aug 2004, 11:02
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:
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;
Der verschlüsselte String kommt als MIME64 codiert rein (so, wie er vom PHP-Skript rauskommt)
und braucht auch nicht noch extra umgewandelt werden.

Tobi
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

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

  Alt 19. Aug 2004, 18:21
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz