![]() |
Decrypten von Daten in TStringList fehlerhaft
Hallo ich verschlüssele einen String den ich dann in eine TStringList schreibe welche wiederum als datei gespeichert wird. Wennn ich nun aus dieser datei wieder entschlüsseln möchte so bekomme ich nicht das richtige ergebnis.
An der ver-/entschlüsselung kann es nicht liegen, denn:
Delphi-Quellcode:
klappt.
Test:='hallo';
temp.Add(Encrypt(Test,w)); //temp=Tstringlist; test:= Encrypt(Test,w); temp.Add(Decrypt(test,w)) ; kann es sein das zusätzliche zeichen aus der datei in die Stringlist geschrieben/gelesen werden die die ver-/entschlüsselung "verfälschen"?
Delphi-Quellcode:
procedure TfMain.BtOpenEncryptedClick(Sender: TObject);//decrypt from file
Var w:Word; begin w:= 16518; OpenDialog1.Execute; Info.LoadFromFile(OpenDialog1.FileName); EdShowInfo.Text:=Decrypt(Info.Text,w); end; procedure TfMain.SaveEncrypted(Sender: TObject);//save encrypted to file Var InformationText: TStringList; w:Word; Test:String; begin w:= 16518; InformationText:=TstringList.Create(); Test:=Encrypt('TEST',w); InformationText.Add(Test); InformationText.SaveToFile(ExtractFilePath(ParamStr(0))+'reg_info.dat'); MessageDlg('The registration information file "info.dat" was successfully created in:'+sLineBreak+sLineBreak+ '"'+ExtractFilePath(ParamStr(0))+'"',mtInformation,[mbOK],0); end; function Encrypt (const s: string; Key: Word) : string; var i : byte; c1,c2: Integer; begin c1:=823748325; c2:=1343424; Result:=s; SetLength(Result, length(s)); for i := 1 to (length (s)) do begin Result[i] := Char (byte (s[i]) xor (Key shr 8)); Key := (byte (Result[i]) + Key) * c1 + c2 end end; function TfMain.Decrypt (const s: string; Key: Word) : string; var i : byte; c1,c2: Integer; begin c1:=823748325; c2:=1343424; begin SetLength(Result, length(s)); Result:=s; for i := 1 to (length (s)) do begin Result[i] := Char (byte (s[i]) xor (Key shr 8)); Key := (byte (s[i]) + Key) * c1 + c2 end end; end; procedure TfMain.FormCreate(Sender: TObject); begin Info:=TStringList.Create; end; |
AW: Decrypten von Daten in TStringList fehlerhaft
Eine StringList speichert ihre Daten zeilenweise in einer Text-Datei. Beim Lesen werden diese Zeilen wieder zu einzelnen Stringlist-Einträgen. Kannst du sicherstellen, daß deine verschlüsselten Strings keine Zeilenende-Zeichen beinhalten?
|
AW: Decrypten von Daten in TStringList fehlerhaft
Es handelt sich bei dem "Text" der verschlüsselt wird und dann verschlüsselt abgespeichert wird um einen einzigen String abgesehen davon und um auf die eigentliche frage zu antworten: nein kann ich nicht bzw. wie soll ich das sicherstellen ?
schonmal ein danke im voraus =) |
AW: Decrypten von Daten in TStringList fehlerhaft
Beim Verschlüsseln mit XOR entstehen aus einem Text binäre Daten, die man nicht verlustlos in einer StringList speichern kann.
Möglichkeit 1: Auf StringList als Zwischenspeicher verzichten und stattdessen den String direkt speichern und laden. Möglichkeit 2: Des verschlüsselten String mit Base64 oder Base16 kodieren, damit keine undruckbaren Zeichen (inbesondere das Zeichen #0) in die Stringliste kommen. Beim Entschlüsseln braucht man dann natürlich die Umkehrfunktion. Base16 ist nichts anderes als die bekannte hexadezimale Codierung, bei dem 1 Byte mit 256 Zuständen in zwei Zeichen (0-F) umgewandelt wird. ![]() |
AW: Decrypten von Daten in TStringList fehlerhaft
Was macht denn Encrypt?
Wenn bei der Verschlüsselung aus "einfachen" Zeichen "Steuerzeichen" entstehen, dann handelt es sich quasi um "binäre" Daten und diese darfst du nicht in Komponenten laden, welche auf entsprechende Steuerzeichen reagieren. Bei der TStringList sind das vorallem #0, #10 und #13. - alles nach einer #0 wird ignoriert - und Zeichen #10 und #13 werden eventuell umgewandelt, bzw. die TStringList paßt Zeilenumbrüche an den des Systems an |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
Zitat:
|
AW: Decrypten von Daten in TStringList fehlerhaft
Delphi-Quellcode:
und
function HexStringToStr(s : string):string;
begin if s = '' then Result := '' else begin if Odd(length(s)) then s := '0'+s; SetLength(Result, Length(s) div 2); HexToBin(Pchar(s), PChar(Result), Length(Result)); end; end; procedure TfMain.BtOpenClick(Sender: TObject); Var w:Word; Crypt: String; begin w:=16518; OpenDialog1.Execute; RegInfo.LoadFromFile(OpenDialog1.FileName); Crypt:=RegInfo.Text; EdShowInfo.Text:=Decrypt(HexStringToStr(Crypt),w);// load decryptet from Base16 end;
Delphi-Quellcode:
jetzt bekomme ich einen halb richtig entschlüsselten string :D
function StrToHexString(const s : string):string;
begin if s = '' then Result := '' else begin SetLength(Result, Length(s)*2); BinToHex(PChar(s), PChar(Result), Length(s)); end; end; procedure TfMain.SaveEncrypted(Sender: TObject); Var InformationText: TStringList; w:Word; Crypt:String; begin fMain.Visible:=false; w:= 16518; InformationText:=TstringList.Create(); Crypt:=StrToHexString(Encrypt(CreateRegInfo,w)); // Save encrypted as Base16 InformationText.Add(Crypt); InformationText.SaveToFile(ExtractFilePath(ParamStr(0))+'reg_info.dat'); end; edit: irgendwo ist noch der wurm drinne ^^ danke für die antworten |
AW: Decrypten von Daten in TStringList fehlerhaft
es wird immer die hälfte der länge des verschlüsselten und strings richtig entschllüsselt
|
AW: Decrypten von Daten in TStringList fehlerhaft
Da würde ich ein neueres Delphi mit UniCode-Char vermuten.
Natürlich wäre es für die Fehlersuche auch hilfreich,zu sehen mit welchen Daten Du arbeitest. Gruß K-H |
AW: Decrypten von Daten in TStringList fehlerhaft
Warum liest/schreibst (ver/enrschlüsselst) Du die Daten nicht in einen (File)Stream, dann hättest Du den ganzen (Unicode)Stringärger "von der Backe"?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:54 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 by Thomas Breitkreuz