![]() |
DCPCrypt Datei zeilenweise verschlüsseln.
Hallo.
Ich versuche eine Datei zeilenweise zu verschlüsseln und später ausgesuchte Zeilen aus der Datei zu entschlüsseln. Ich kann es per Datei öffnen und zeilenweise lesen, bzw. wie hier per StringList realisieren. Beide Fälle funktionieren sehr gut. Allerdings nur wenn ich die ganze Datei zeilenweise verschlüssele und auf dem gleichen Weg entschlüssele. Hier mein Code:
Delphi-Quellcode:
Decrypt halt mit der gleichen Routine nur die Zeile anders.
procedure TForm1.ButtonDCPEncryptClick(Sender: TObject);
var Cipher : TDCP_Cipher; DateiName : string; Liste : TStringList; ListeCr : TStringList; index : Integer; begin {Datei zeilenweise einlesen und mit DCPCrypt verschlüsseln **********} if EditDatei.Text = '' then begin MessageBox(0, 'Zuerst eine Datei wählen.' ,'Hinweis !' ,MB_ICONWARNING); exit; end; try DateiName := ExtractFileName(EditDatei.Text); SaveDialog1.Filename := DateiName; SaveDialog1.Filter := 'Alle-Dateien|*.*;'; SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName); if SaveDialog1.Execute then begin Liste := TStringlist.Create; ListeCr := TStringlist.Create; Liste.BeginUpdate; Liste.LoadFromFile(DateiName); Liste.EndUpdate; Cipher := TDCP_rijndael.Create(Self); Cipher.InitStr(EditPasswort.Text,TDCP_sha1); try try for Index := 0 to Liste.Count - 1 do ListeCr.Add(Cipher.EncryptString(Liste.Strings[Index])); except end; finally Cipher.Burn; Cipher.Free; end; ListeCr.SaveToFile(SaveDialog1.Filename); end; finally FreeAndNil(Liste); FreeAndNil(ListeCr); end; EditDatei.Text := ''; MessageBox(0, 'DONE' ,'Hinweis !' ,MB_ICONWARNING); end; ListeCr.Add(Cipher.DecryptString(Liste.Strings[Index])); Das Problem ist, ich möchte die Datei verschlüsseln aber so dass ich danach eine Zeile aus der Datei raus kopiere und die eine Zeile dann entschlüssele. Etwa. so. Ich habe eine ini Datei (Datei ist recht groß. ca. 1000 Zeilen oder auch mehr) die verschlüssele ich. Ich möchte aber nur gewisse Werte aus de Datei entschlüsseln. Sagen wir ein Wert in der Zeile 33 und ein Wert aus der Zeile 177. Meine Entschlüsselung der Zeile realisiere ich so:
Delphi-Quellcode:
Wenn ich aber die gewollten Zeilen entschlüssele kommt nur Müll raus.
procedure TForm1.ButtonDecryptStringClick(Sender: TObject);
var Cipher : TDCP_Cipher; begin Cipher:= TDCP_rijndael.Create(Self); Cipher.InitStr(EditPasswort.Text,TDCP_sha1); Edit1.Text := Cipher.DecryptString(Edit2.Text); Cipher.Burn; Cipher.Free; end; Ich glaube es hängt irgendwie mit den Zeilenumbrüchen zusammen. Leider übersteigt es mein Können. Könnt Ihr mir helfen das Problem zu lösen. Noch ein Beispiel. Meine Datei (Ausschnitt) OldStyleTree=0 autotreechange=0 DirBrackets=1 ShowParentDirInRoot=0 SortDirsByName=1 Nach der Verschlüsselung pxEReG8XB1dTh2W+yUk= XAGbX+ByEUrrMshUwOB/PA== KqjalzvrAjYfOieO/A== PC0Db1r9O2w22yO3Rh+gTXLPwVxN YDwPxwqArrDKCQpGdRHUCA== Wenn ich nun die 4-te Zeile entschlüssele, bekommen ich das hier raus ÔEO›y·‡òœÇâ_Öoot=0 es sollte aber das rauskommen ShowParentDirInRoot=0 Eventuell andere Vorschläge wie ich es realisieren kann schaue ich mir gerne an. Ich freue mich über jede Hilfe. Ach ja. Ich habe keine Möglichkeit die Datei komplett zu entschlüsseln, Zeile zu lesen und dann zu löschen. Es sollte schon so funktionieren wie ich es geschildert habe. |
AW: DCPCrypt Datei zeilenweise verschlüsseln.
Gekürzt ergibt dein ButtonDCPEncryptClick also folgenden Verschlüsselungscode?
Delphi-Quellcode:
Im Vergleich zur Entschlüsselung sieht der erstmal "fast" OK aus und funktioniert es auch, wenn du beide Codes zur Ver- und Entschlüsselung hintereinander ausführst?
Cipher := TDCP_rijndael.Create(Self);
try Cipher.InitStr(EditPasswort.Text, TDCP_sha1); Cipher.EncryptString('1. Zeile'); // fällt dir was auf? Cipher.EncryptString('2. Zeile'); Cipher.EncryptString('3. Zeile'); Edit2.Text := Cipher.EncryptString(Edit1.Text); Cipher.Burn; finally Cipher.Free; end; Du müsstest also eigentlich bei jedem Schleifendurchlauf den Chipser neu initialiiseren (InitStr), oder beim Auslesen auch erstmal alle vorherrigen Zeilen entschlüsseln. (ich glaub nur nicht ganz, daß das der Sicherheit zuträglich ist) PS: Hier noch ein paar Anmerkungen im Code.
Delphi-Quellcode:
procedure TForm1.ButtonDCPEncryptClick(Sender: TObject);
var Cipher : TDCP_Cipher; DateiName : string; Liste : TStringList; index : Integer; begin {Datei zeilenweise einlesen und mit DCPCrypt verschlüsseln **********} if EditDatei.Text = '' then begin MessageBox(0, 'Zuerst eine Datei wählen.' ,'Hinweis !' ,MB_ICONWARNING); exit; end; Liste := TStringlist.Create; // das gehört vor das TRY !!! try DateiName := ExtractFileName(EditDatei.Text); SaveDialog1.Filename := DateiName; SaveDialog1.Filter := 'Alle-Dateien|*.*;'; SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName); if SaveDialog1.Execute then begin Liste.BeginUpdate; Liste.LoadFromFile(DateiName); Liste.EndUpdate; Cipher := TDCP_rijndael.Create(Self); try Cipher.InitStr(EditPasswort.Text,TDCP_sha1); // das kommt nach das TRY !!! //try for Index := 0 to Liste.Count - 1 do Liste.Strings[Index] := Cipher.EncryptString(Liste.Strings[Index]); // eine zweite Liste ist hier nicht unbedingt nötig, da alles auch in Einer gemacht werden kann //except // Warum ignorierst/verwirfst du einfach so fahrlässig eine Fehlermeldung und behauptest am Ende (DONE) auch noch daß alles ordnunggemäß verschlüsselt wurde? // Und kommt es denn oft vor, daß es hier knallt? //end; Cipher.Burn; // das davor finally Cipher.Free; end; Liste.SaveToFile(SaveDialog1.Filename); end; finally Liste.Free; // Free reicht eigentlich, aber das FreeAndNil ist zumindestens kein Fehler. end; EditDatei.Text := ''; MessageBox(0, 'DONE' ,'Hinweis !' ,MB_ICONWARNING); end; |
AW: DCPCrypt Datei zeilenweise verschlüsseln.
Danke erst Mal für die schnelle Antwort.
So kann ich sehr gut lernen. Zuerst ein Lob auf deine Art Dinger zu erklären. So verstehe ich es am besten. Vielen dank dafür. Ich bin leider kein begabter Coder. Versuche aber mein bestes zu geben. Liste := TStringlist.Create; // das gehört vor das TRY !!! Das ist mir aber klar, war ein versehen. Ich habe nur das relevante zusammen kopiert. Eben beim kopieren übersehen. Genauso wie except. Ich fange Fehler schon auf, habe es aber für unwichtig gehalten bei der Frage. ListeCR brauche ich nicht, habe aber gedacht dass mein Ergebnis dadurch verfälscht wird. Ich habe einiges probiert bis ich mich erst entschlossen habe zu fragen. So oft Sachen probiert dass ich zum Schluss ganz durcheinander war. Das aber: Cipher.Burn; // das davor Ehrlich gesagt habe ich gedacht es gehört nach finally. Schon wieder was gelernt. Der eigentlicher fahren liegt aber bei der Cipher.InitStr(....... Das kommt von Unwissenheit. Hier mein Code was nun funktioniert. Für meine Zwecke vollkommen ausreichend.
Delphi-Quellcode:
Falls weitere Fehler auftauchen bitte um Korrektur.
procedure TForm1.ButtonDCPEncryptClick(Sender: TObject);
var Cipher : TDCP_Cipher; DateiName : string; Liste : TStringList; index : Integer; begin if EditDatei.Text = '' then begin MessageBox(0, 'Zuerst eine Datei wählen.' ,'Hinweis !' ,MB_ICONWARNING); exit; end; Liste := TStringlist.Create; try DateiName := ExtractFileName(EditDatei.Text); SaveDialog1.Filename := DateiName; SaveDialog1.Filter := 'Alle-Dateien|*.*;'; SaveDialog1.InitialDir := ExtractFilePath(Application.ExeName); if SaveDialog1.Execute then begin Liste.BeginUpdate; Liste.LoadFromFile(DateiName); Liste.EndUpdate; Cipher := TDCP_rijndael.Create(Self); try try for Index := 0 to Liste.Count - 1 do begin Cipher.InitStr(EditPasswort.Text,TDCP_sha1); Liste.Strings[Index] := Cipher.EncryptString(Liste.Strings[Index]); Cipher.Burn; end; except on E:Exception do MessageDlg(E.Message, mtError, [mbOk], 0); end; finally Cipher.Free; end; Liste.SaveToFile(SaveDialog1.Filename); end; finally Liste.Free; end; EditDatei.Text := ''; MessageBox(0, 'DONE' ,'Hinweis !' ,MB_ICONWARNING); end; |
AW: DCPCrypt Datei zeilenweise verschlüsseln.
Da brauchst'e eigentlich keine Sorgen haben.
Eine "Kopie" des Strings geht ja in die Funktion und danach wird dann das Ergebnis in die Stringliste geschrieben. Und da du den alten Zeileninhalt danach nicht mehr braucht, kann man ihn also problemlos gleich ersetzen. Das
Delphi-Quellcode:
kannst du zwar auch erst in dem Try-Finally machen, aber dann mußt du vor dem Try zumindestens die Variable initialisieren,
Liste := TStringlist.Create;
so wie es dir bestimmt der Compiler auch in seinen Meldungen gesagt hat. :zwinker: Grund: Wenn es vor dem Create knallt, wäre die Variable nicht initialisiert und das Free im Finally könnte knallen, aufgrund einer ungültigen Klasseninstanz. Oder noch schlimmer, wenn der Wert zufällig dem Instanzzeiger irgendeiner Klasse übereinstimmt, dann ist diese Instanz plötzlich weg und es knallt womöglich ganz wo andes irgendwann mal. :stupid: Nja, ich weiß jetzt nicht genau was das Burn macht, aber wenn es bei dem Befehl knallen täte, dann würde das Free danach nicht mehr ausgeführt. Wenn es unbedingt zum Aufräumen nötig ist, dann nochmal ein Try-Except oder Finally drumrum, damit das Free sicher ausgeführt werden kann. Aber ich hoffe mal die haben beim Destroy dafür gesorgt, daß immer ordentlich aufgeräumt wird, selbst ohne daß das Burn ausgeführt wurde (weil es voher knallte), drum isses einfach vor's Finally gerutscht. :angel: PS: Statt MessageDlg kannst du auch die exceptiondialoge vom Delphi benutzen. ShowException (SysUtils) ist der Dialog der RTL Application.ShowException ist der Dialog der VCL Application.HandleException wendet sich entweder Application.ShowException oder ShowException
Delphi-Quellcode:
Uber
try
... except Application.HandleException(Self); // oder nil, wenn es keine Owner-Klasse gibt end;
Delphi-Quellcode:
kann man die Meldung erweitern.
on E: Exception do E.Message := 'Böser Fehler in Xyz: ' + E.Message;
Wenn man sich an ApplicationHandleException oder ApplicationShowException (Classes) wenden würde, nur leider gibt es dafür keinen "sicheren" einstieg. :wall: Das macht sich übrigens besser, wenn man mal global Exception-Dialoge ausblenden will/muß (z.B. beim Umbau auf eine Server-App), oder sie zumindestens ersetzen möchte, so wie es z.B. EurekaLog und MadExcept machen, indem sie ihre eigenen erweiterten Dialoge anzeigen.
Delphi-Quellcode:
try
... except if Assigned(ApplicationHandleException) then ApplicationHandleException(Self) else if Assigned(Application) then Application.HandleException(Self) else ShowException(ExceptObject, ExceptAddr); end;
Delphi-Quellcode:
k.A. warum Borland/Codegear/Embarcadero das nicht schön in einer Funktion gekapselt haben, damit man sich richtig und vorallem einfach an die Exceptionbehandlung wenden kann. :wall:
try
... except if Assigned(ApplicationShowException) then ApplicationShowException(ExceptObject) else if Assigned(Application) then Application.ShowException(ExceptObject) else ShowException(ExceptObject, nil); end; Application.ShowException zeigt die Meldung immer an und Application.HandleException ignoriert einige Exceptions (z.B. EAbort), wendet sich ansonsten erstmal an Application.OnException und seit erst dann die Exception an, oder auch nicht ... jenachdem, ob und wie man die Exception "behandelt". Also einfach immer an Application.HandleException wenden. Da kann man dann entweder alle Exceptions global im OnException (TApplication oder TApplicationEvents) loggen und oder ausblenden. |
AW: DCPCrypt Datei zeilenweise verschlüsseln.
Ich danke dir noch Mal.
Super erklärt und auch für Anfänger verständlich. Besten Dank.So macht es wirklich Lust auf mehr. :-D:-D:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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