![]() |
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; |
Re: dcpcrypt + Delphi 2009 = falsches en/decryption
Könnte ein AnsiString/WideString-Problem sein.
|
Re: dcpcrypt + Delphi 2009 = falsches en/decryption
Habe gerade mal die anderen Beispiele probiert (Dateiverschlüsselung).
Die funktionieren tadellos. |
Re: dcpcrypt + Delphi 2009 = falsches en/decryption
Zitat:
Also entweder auf Delphi-Seite auf Ansi-Strings umstellen oder die PHP-Seite auf Unicode/UTF16. |
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. |
Re: dcpcrypt + Delphi 2009 = falsches en/decryption
Zitat:
Du müsstest festellen das eine verschlüsselten Datenströme normalerweise doppelt so große Dateien als früher erzeugen. |
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:
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.
var Data, Key, IV : ansistring;
Im übrigen scheinen die Konstanten (16, 128 etc) für Unicodestrings um den Faktor 2 falsch zu sein. Gruß Gammatester |
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 04:26 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