Autor Beitrag
immortuus
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 14.05.07 11:38 
Hallo,

ich habe ein Problem mit dem Verschlüsseln von einem String.

Das Problem ist ich muss in Delphi einen String Verschlüsseln (ich habe die StreamSec Komponenten zum Verschlüsseln zur Verfügung). Dieser String muss von einem PHP Script wieder Entschlüsselt werden. Dort habe ich mcrypt zur Verfügung. Ich nutze BlowFish mit CFB.

In Delphi klappt das verschlüsseln und entschlüsseln genauso wie in php. Wenn aber php einen verschlüsselten String von Delphi (wird mit Base64encoded übergeben) entschlüsseln soll kommt nur Zeichensalat raus. Ich habe den selben Key genommen.

Wer kann helfen?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 14.05.07 12:45 
Vermutlich hast Du den String in Delphi mit Längenbyte gespeichert. Du musst den String in einen PChar umwandeln. Natürlich vor der Verschlüsselung. :wink:
immortuus Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 14.05.07 13:18 
Das Problem habe ich schon erkannt:

vieleicht mal ein beispiel:

Delphi:
ausblenden Delphi-Quelltext
1:
2:
3:
  buffer := EncryptString(caBlowFish, cmCFB, '324tg34t432t2346q3tqa43''Testasef2q324f2 rf23f');
  buffer := Copy(buffer,2,Length(buffer));
  buffer := Base64Encode(buffer);


buffer ist dann: 'UvuPc+deWFW4mqIBsfsjcbv09nc='

PHP:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    /* Data */
    $key = '324tg34t432t2346q3tqa43';
   
    /* Open module, and create IV */ 
    $td = mcrypt_module_open('blowfish''''cfb''');
    //ka was das bringt...
    //$key = substr($key, 0, mcrypt_enc_get_key_size($td));
    $iv_size = mcrypt_enc_get_iv_size($td);
    
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    /* Initialize encryption handle */
    $s = base64_decode('UvuPc+deWFW4mqIBsfsjcbv09nc=');
    if (mcrypt_generic_init($td, $key, $iv) != -1
      echo mdecrypt_generic($td, $s);
    /* Clean up */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);




Moderiert von user profile iconTino: Delphi- und PHP-Tags hinzugefügt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 14.05.07 13:38 
Delphi:
ausblenden Delphi-Quelltext
1:
2:
3:
  buffer := EncryptString(caBlowFish, cmCFB, '324tg34t432t2346q3tqa43''Testasef2q324f2 rf23f');
  buffer := Copy(buffer,2,Length(buffer));
  buffer := Base64Encode(buffer);

buffer ist dann: 'UvuPc+deWFW4mqIBsfsjcbv09nc='
Weclehn Type hat buffer und warum entfernst Du die ersten zwei Stellen nach dem EncryptString?

PHP:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
    /* Data */
    $key = '324tg34t432t2346q3tqa43';
   
    /* Open module, and create IV */ 
    $td = mcrypt_module_open('blowfish', '', 'cfb', '');
    //ka was das bringt...
    //$key = substr($key, 0, mcrypt_enc_get_key_size($td));
    $iv_size = mcrypt_enc_get_iv_size($td);
    
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    /* Initialize encryption handle */
    $s = base64_decode('UvuPc+deWFW4mqIBsfsjcbv09nc=');
    if (mcrypt_generic_init($td, $key, $iv) != -1) 
      echo mdecrypt_generic($td, $s);
    /* Clean up */
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);

Bei "ka was das bringt...":
Das sieht mir danach aus, dass hier die Key-Länge sichergestellt wird, die in $td steht. Falls Du mit einer falschen Länge arbeitest, kann der key nicht funtionieren. Ich sehe auch nirgendwo, dass Du die Länge setzt. Also wird vrmtl. eine Standard-Länge verwendet.
immortuus Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 14.05.07 14:22 
Die EncryptString Funktion ist von der besagten StreamSec Komp.

Die leifert einen AnsiString zurück, buffer ist auch vom typ AnsiString. Das was von der Funktion zurückkommt hat als erstes zeichen immer #0 was ja für das Stringende steht... auch wenn ichs nicht abschneide bekomme ich nur zeichensalat

zu der längenbegrenzung im php, dass hab ich auch schon getestet. mit geht es nicht (is ja klar) und ohne auch nicht, auch wenn ich den key auf die länge trimme die mcrypt_enc_get_key_size zurückgibt (was im PHP 56 ist).

ich weis nicht weiter....
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 14.05.07 14:57 
user profile iconimmortuus hat folgendes geschrieben:
Die EncryptString Funktion ist von der besagten StreamSec Komp.
Ich kenne die leider nicht. Daher habe ich erstmal grundsätzliche Fehler gesucht.

user profile iconimmortuus hat folgendes geschrieben:
Die leifert einen AnsiString zurück, buffer ist auch vom typ AnsiString. Das was von der Funktion zurückkommt hat als erstes zeichen immer #0 was ja für das Stringende steht... auch wenn ichs nicht abschneide bekomme ich nur zeichensalat
Dann ist schon prinzipiell etwas falsch. Gibt es Beispiele zu den Komponenten, die auch funktionieren? Vielleicht findest Du auf diese Art den Fehler.

user profile iconimmortuus hat folgendes geschrieben:
zu der längenbegrenzung im php, dass hab ich auch schon getestet. mit geht es nicht (is ja klar) und ohne auch nicht, auch wenn ich den key auf die länge trimme die mcrypt_enc_get_key_size zurückgibt (was im PHP 56 ist).
Vielleicht weiß hier ein PHP-Spezi mehr? Mir kommt es jedenfalls merkwürdig vor, dass die Länge nicht der tatsächlichen Länge des Keys entspricht.
immortuus Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 15.05.07 13:49 
Kennt einer evtl. eine andere methode mit der ich die komunikation sicher bekommen?

der von Delphi verschlüsselte string wird übers internet übertragen...

sagt jetzt nicht ssl, ich muss alle parameter irgendwie unkenntlich machen so das nur ich das php script nutzen kann.