![]() |
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"?
|
AW: Decrypten von Daten in TStringList fehlerhaft
Ich nutze XE2 wie behebe ich den jetzt das problem ? ich weiß nicht wo ich ansetzen soll
|
AW: Decrypten von Daten in TStringList fehlerhaft
Stell dir vor, du bist ein Zauberer, der Äpfel (Strings) in ein rohes heiles Ei verwandeln (encrypten) und auch wieder zurück in einen Apfel verwandeln (decrypten) kann.
Deine Assistentin kann mit verbundenen Augen Äpfel fangen. Du verwandelst jetzt einen Apfel in ein Ei und wirfst es der Assistentin zu. Die erwartet aber einen Apfel und was kann passieren? Jo, das Ei könnte kaputt gehen, und die Rückverwandlung klappt nicht mehr. Genau das passiert mit deinem verschlüsslten String. Nach der Verschlüsselung ist das kein String mehr und darf infolge dessen auch nicht mehr als solcher behandelt werden (was du aber machst) ;) |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
Wie in Beitrag #10 gesagt, empfiehlt sich ein Filestream. Damit kannst du "Binärdaten" (also auch nicht druckbare Zeichen und so) problemlos verarbeiten. Gundzüge sehen ungefähr so aus:
Delphi-Quellcode:
Konkrete Codebeispiele kannst du sicher über eine Suchmaschine finden.
str := Encrypt(...);
fs := TFilestream.Create(...); try fs.WriteBuffer(Length(str)); fs.WriteBuffer(str[1]); finally fs.free(); end; |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
Sehr schöne Analogie :thumb: |
AW: Decrypten von Daten in TStringList fehlerhaft
Das Apfelmus passt inhaltlich ja besser, trotzdem :thumb::thumb::thumb:
Gruß K-H |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
|
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
Andererseits eigenen sich in Delphi Strings zur Aufnahme binärer Daten und seine Funktion gibt ja bereits eine String zurück. Müsste also schon gehen... oder? |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
|
AW: Decrypten von Daten in TStringList fehlerhaft
Da hast Du natürlich recht, aber
seitdem das Windows-API an sehr vielen Stellen, auch unbeabsichtig mitspielt, ist diese Benutzung mit Vorsicht zu genießen. es gibt hier im Forum viele Posts, die darauf schließen lassen, daß ein String ein irgendwie magischer Datenspeicher ist, der alle in ihm enthaltene Daten auf magische Weise sinnvoll darstellen kann; Und irgendwie ist dies nicht auszurotten. Selbst für gestandene Delphianer ist dies ein Thema, was nicht ohne Tücken ist. ((Unicode)-Char) (und da muß dann ein x0000 als Begrenzer herhalten.) Gruß K-H |
AW: Decrypten von Daten in TStringList fehlerhaft
Zitat:
|
AW: Decrypten von Daten in TStringList fehlerhaft
habe das hier gefunden
![]() nutze es und es funktioniert auch zumindest soweit man die ergbnise optisch auf dem bildschirm vergleicht. mit dem auge betrachtet ist das original der zuerst verschlüsselt und dann entschlüsselten kopie identisch. jedoch nutze ich eine xml datei für eine TClientDataset... und das gibt mir ein "missmatch in datapacket" aus wenn ich die entschlüsselte verschlüsselte kopie der original xml einlesen will mit Dataset.LoadFromFile(...) :?: |
AW: Decrypten von Daten in TStringList fehlerhaft
ok sry habs selbst gefunden musste das data set mit
dataset.SaveToFile(ExtractFilePath(ParamStr(0))+'D B2.xml',dfbinary); als Binary speichern danke trotzdem =) ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 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