AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DCPCrypt Datei zeilenweise verschlüsseln.

Ein Thema von IMPEGA · begonnen am 19. Jun 2014 · letzter Beitrag vom 20. Jun 2014
Antwort Antwort
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 17:58
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:
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;
Decrypt halt mit der gleichen Routine nur die Zeile anders.
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:
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;
Wenn ich aber die gewollten Zeilen entschlüssele kommt nur Müll raus.
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.

Geändert von IMPEGA (19. Jun 2014 um 18:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 18:51
Gekürzt ergibt dein ButtonDCPEncryptClick also folgenden Verschlüsselungscode?
Delphi-Quellcode:
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;
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?

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;
$2B or not $2B

Geändert von himitsu (19. Jun 2014 um 18:58 Uhr)
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 19:43
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:
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;
Falls weitere Fehler auftauchen bitte um Korrektur.

Geändert von IMPEGA (19. Jun 2014 um 20:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 19. Jun 2014, 21:14
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 Liste := TStringlist.Create; kannst du zwar auch erst in dem Try-Finally machen, aber dann mußt du vor dem Try zumindestens die Variable initialisieren,
so wie es dir bestimmt der Compiler auch in seinen Meldungen gesagt hat.
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.

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.

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:
try
  ...
except
  Application.HandleException(Self); // oder nil, wenn es keine Owner-Klasse gibt
end;
Uber on E: Exception do E.Message := 'Böser Fehler in Xyz: ' + E.Message; kann man die Meldung erweitern.

Wenn man sich an ApplicationHandleException oder ApplicationShowException (Classes) wenden würde, nur leider gibt es dafür keinen "sicheren" einstieg.
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:
try
  ...
except
  if Assigned(ApplicationShowException) then
    ApplicationShowException(ExceptObject)
  else if Assigned(Application) then
    Application.ShowException(ExceptObject)
  else
    ShowException(ExceptObject, nil);
end;
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.

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.
$2B or not $2B
  Mit Zitat antworten Zitat
IMPEGA

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: DCPCrypt Datei zeilenweise verschlüsseln.

  Alt 20. Jun 2014, 07:03
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.

  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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