Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dcpcrypt + Delphi 2009 = falsches en/decryption (https://www.delphipraxis.net/144307-dcpcrypt-delphi-2009-%3D-falsches-en-decryption.html)

Hedge 4. Dez 2009 20:44


dcpcrypt + Delphi 2009 = falsches en/decryption
 
Ich habe heute die aktuelle Version von dcpcrypt die für Delphi 2009 geeignet sein soll installiert.

Auf der Seite von dcpcrypt gibt es ein Beispiel zur Kommunikation mit PHP-Scripts.

Die bereits kompilierte Exe funktioniert tadellos (nach encrypten einer Zeichenkette wieder in die Ausgangszeichenfolge decrypten).

Wenn ich das Beispiel selbst kompiliere kommt ein ganz anderer Ciphertext beim encrypten raus und entsprechend auch ein falsches Ergebnis beim decrypten.

Der Code ent- und verschlüsseln ist folgender:

Delphi-Quellcode:
// Encrypt a string and return the Base64 encoded result
procedure TfrmMain.btnEncryptClick(Sender: TObject);
var
  Cipher : TDCP_rijndael;
  Data, Key, IV : string;
begin
  // Pad Key, IV and Data with zeros as appropriate
  Key := PadWithZeros(boxKey.Text,KeySize);
  IV := PadWithZeros(boxIV.Text,BlockSize);
  Data := PadWithZeros(boxPlainTextIn.Text,BlockSize);
  // Create the cipher and initialise according to the key length
  Cipher := TDCP_rijndael.Create(Self);
  if Length(boxKey.Text) <= 16 then
    Cipher.Init(Key[1],128,@IV[1])
  else if Length(boxKey.Text) <= 24 then
    Cipher.Init(Key[1],192,@IV[1])
  else
    Cipher.Init(Key[1],256,@IV[1]);
  // Encrypt the data
  Cipher.EncryptCBC(Data[1],Data[1],Length(Data));
  // Free the cipher and clear sensitive information
  Cipher.Free;
  FillChar(Key[1],Length(Key),0);
  // Display the Base64 encoded result
  boxCipherTextOut.Text := Base64EncodeStr(AnsiString(Data));
end;

procedure TfrmMain.btnDecryptClick(Sender: TObject);
var
  Cipher : TDCP_rijndael;
  Data, Key, IV : string;
begin
  // Pad Key and IV with zeros as appropriate
  Key := PadWithZeros(boxKey.Text,KeySize);
  IV := PadWithZeros(boxIV.Text,BlockSize);
  // Decode the Base64 encoded string
  Data := Base64DecodeStr(AnsiString(boxCipherTextIn.Text));
  // Create the cipher and initialise according to the key length
  Cipher := TDCP_rijndael.Create(Self);
  if Length(boxKey.Text) <= 16 then
    Cipher.Init(Key[1],128,@IV[1])
  else if Length(boxKey.Text) <= 24 then
    Cipher.Init(Key[1],192,@IV[1])
  else
    Cipher.Init(Key[1],256,@IV[1]);
  // Decrypt the data
  Cipher.DecryptCBC(Data[1],Data[1],Length(Data));
  // Free the cipher and clear sensitive information
  Cipher.Free;
  FillChar(Key[1],Length(Key),0);
  // Display the result
  boxPlainTextOut.Text := Data;
end;

mkinzler 4. Dez 2009 20:52

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Könnte ein AnsiString/WideString-Problem sein.

Hedge 4. Dez 2009 20:53

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Habe gerade mal die anderen Beispiele probiert (Dateiverschlüsselung).

Die funktionieren tadellos.

Bernhard Geyer 4. Dez 2009 22:18

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Zitat:

Zitat von Hedge
Habe gerade mal die anderen Beispiele probiert (Dateiverschlüsselung).

Die funktionieren tadellos.

Dann wird es wohl ein Ansi/Unicodeproblem sein. Bei Ansi ist 1 Zeichen = 1 Byte, Bei Unicode (UTF16 als normalcodierung unter Windows) ist 1 Zeichen = 2-4 Byte!

Also entweder auf Delphi-Seite auf Ansi-Strings umstellen oder die PHP-Seite auf Unicode/UTF16.

Hedge 4. Dez 2009 22:30

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Es geht ja noch nichtmal um den Austausch zwischen PHP und Delphi.

Ich will einfach nur (im Delphiprogramm) die selbe Zeichenkette nach dem verschlüsseln und entschlüsseln wieder zurückkriegen die ich davor auch eingegeben habe.

Bernhard Geyer 4. Dez 2009 22:36

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Zitat:

Zitat von Hedge
Ich will einfach nur (im Delphiprogramm) die selbe Zeichenkette nach dem verschlüsseln und entschlüsseln wieder zurückkriegen die ich davor auch eingegeben habe.

dann must du mit Ansi-Strings arbeiten damit wieder 1 Character = 1 Byte wird.

Du müsstest festellen das eine verschlüsselten Datenströme normalerweise doppelt so große Dateien als früher erzeugen.

gammatester 4. Dez 2009 22:38

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Im ganzen dcpcrypt-2009 werden nackte strings nur für GetAlgorithm/Namen etc benutzt. Verschlüsselt und codiert wird immer mit ansistrings. Also solltest Du (wie mkinzler schon angedeutet hat) Deine Datenstrings als ansistrings deklarieren:
Delphi-Quellcode:
var Data, Key, IV : ansistring;
Ich unterstelle mal, daß die Dateiverschlüsselung sinnvollerweise mit bytes (und nicht mit diesen unsinnigen Strings) arbeitet. Also wäre es kein Wunder, wenn es da klappt.

Im übrigen scheinen die Konstanten (16, 128 etc) für Unicodestrings um den Faktor 2 falsch zu sein.

Gruß Gammatester

Hedge 4. Dez 2009 22:45

Re: dcpcrypt + Delphi 2009 = falsches en/decryption
 
Ohje, das ist wieder selten dämlich.

Ich habe überall in der gesamten Komponente aus den Strings AnsiStrings gemacht, aber in meinem eigenen Projekt habe ich es schleifen lassen.

Tut mir vielmals leid euch damit aufgehalten zu haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 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