Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verschlüsselte Ini lesen? (https://www.delphipraxis.net/107409-verschluesselte-ini-lesen.html)

Zacherl 27. Jan 2008 12:41

Re: Verschlüsselte Ini lesen?
 
Ich war mal so nett. Den MemoryStream hätte man zwar gar nicht gebraucht, weil man auch direkt hätte die StringList zum Laden verwenden können, aber ich war zu faul das wieder umzuschreiben: Okay doch noch schnell den MemoryStream rausgenommen :P

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils, IniFiles, Classes;

procedure XORMem(Data: Pointer; Len: Int64);
var
  I: Cardinal;
begin
  for I := 0 to Len do
  begin
    PByte(Cardinal(Data) + I)^ := 23 xor PByte(Cardinal(Data) + I)^;
  end;
end;

var
  Ini: TMemIniFile;
  Lines: TStringList;
  S: String;
begin
  Lines := TStringList.Create;
  try
    // Datei laden und entschlüsseln, fals schon angelegt
    if FileExists(ExtractFilePath(ParamStr(0)) + 'test.ini') then
    begin
      Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.ini');
      S := Lines.Text;
      XORMem(@S[1], Length(S));
      Lines.Text := S;
    end;
    // Diese Datei landet nie auf der Festplatte
    Ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.tmp');
    try
      Ini.SetStrings(Lines);
      // Hier kann ganz normal mit der Ini gearbeitet werden
      WriteLn(Ini.ReadString('Test', 'TestVal', 'not exists'));
      Ini.WriteString('Test', 'TestVal', 'working!');
      ReadLn;
      // Hier wird die Ini Datei verschlüsselt gespeichert
      Lines.Text := '';
      Ini.GetStrings(Lines);
      S := Lines.Text;
      XORMem(@S[1], Length(S));
      Lines.Text := S;
      Lines.SaveToFile(ExtractFilePath(ParamStr(0)) + 'test.ini');
    finally
      Ini.Free;
    end;
  finally
    Lines.Free;
  end;
end.

Poring 27. Jan 2008 12:45

Re: Verschlüsselte Ini lesen?
 
Bei:
Delphi-Quellcode:

      WriteLn(Ini.ReadString('Test', 'TestVal', 'not exists'));
      Ini.WriteString('Test', 'TestVal', 'working!');
Müssen für Test etc. die Objekte hin die in der Ini [Name] Eintrag1=Test sind oder dies wo oben steht?

edit:
Danke für die Erklärungen :)
Aber: Die Inidatei liegt schon verschlüsselt vor, an ihr wird auch nichts geändert. Ich lese sie nur aus. Würde dies dann so aussehn?:

Delphi-Quellcode:
// Hier kann ganz normal mit der Ini gearbeitet werden
      i:=ini.ReadString('Name', 'Eintrag1', '');
      label2.caption:=i;
      ReadLn;

Zacherl 27. Jan 2008 12:50

Re: Verschlüsselte Ini lesen?
 
Arbeite einfach ganz normal mit der Datei. Wie ohne Verschlüsselung. Der erste Parameter, also "Test" ist das was hinterher in eckigen Klammern steht. Der zweite Parameter ist der Name des Eintrags, also das war vor dem = steht. Der dritte Parameter beim LESEN ist der Wert der zurückgegeben wird, wenn der Eintrag nicht existiert. Beim SCHREIBEN ist der dritte Wert der Wert welcher in die Ini Datei geschrieben wird.

Startest du das Programm zum ersten mal wird "not exists" ausgegeben, weil die Ini ja noch nicht existiert. Gleichzeitig wird der neue Wert "working!" eingetragen, weshalb dieser auch beim zweiten Programmstart ausgegeben wird. Auch kannst du im selben Verzeichnis eine Datei "test.ini" bewundern, welche mit deiner XOR Verschlüsselung behandelt wurde.

Bei der Verschlüsselung würde ich allerdings eher etwas stärkere Algorithmen bevorzugen.

Poring 27. Jan 2008 12:53

Re: Verschlüsselte Ini lesen?
 
Da ich das Schreiben nicht benötige, wäre dies dann der Code?

Delphi-Quellcode:
procedure XORMem(Data: Pointer; Len: Int64);
var
  I: Cardinal;
begin
  for I := 0 to Len do
  begin
    PByte(Cardinal(Data) + I)^ := 23 xor PByte(Cardinal(Data) + I)^;
  end;
end;

var
  Ini: TMemIniFile;
  Lines: TStringList;
  S: String;
begin
  Lines := TStringList.Create;
  try
    // Datei laden und entschlüsseln, fals schon angelegt
    if FileExists(ExtractFilePath(ParamStr(0)) + 'test.ini') then
    begin
      Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'test.ini');
      S := Lines.Text;
      XORMem(@S[1], Length(S));
      Lines.Text := S;
    end;
    // Diese Datei landet nie auf der Festplatte
    Ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.tmp');
    try
      Ini.SetStrings(Lines);
      // Hier kann ganz normal mit der Ini gearbeitet werden - heir etwas geändert
      i:=ini.ReadString('Name', 'Eintrag1', '');
      label2.caption:=i;
      ReadLn;
      // speichern entfernt
    finally
      Ini.Free;
    end;
  finally
    Lines.Free;
  end;
end.

Zacherl 27. Jan 2008 12:57

Re: Verschlüsselte Ini lesen?
 
Ja so kannst du es verwenden. Warum willst du denn nichts speichern mit der Ini? Bzw woher stammt die Ini aus der du lesen willst? :gruebel:

Poring 27. Jan 2008 13:00

Re: Verschlüsselte Ini lesen?
 
Ok, vielen vielen dank :)
Ich werde es gleich mal ausprobieren, wenn noch was schief läuft kann ich ja sicherlich fragen :)

Die Ini habe ich so schon erstellt. Es dient dazu, das er eigentlich alle Daten die benötigt werden aus der Ini gelesen werden. Dadurch muss bei einer änderung nur die Ini geändert werden und nichtmehr die ganze exe.

Mfg

Zacherl 27. Jan 2008 13:16

Re: Verschlüsselte Ini lesen?
 
Die XORMem verschlüsselt / entschlüsselt die Datei nach deinem XOR Verfahren. Hatte das nur erst für MemoryStreams umgeschrieben, funktioniert aber auch mit den Strings.

Den Code unter der XORMem Funktion musst du halt dort aufrufen wo du die Daten auslesen willst. Z.b. in einem Button OnClick oder im OnCreate Ereigniss des Formulars.

[Edit: Rote Box :P Eh ja klar kannst gerne nachfragen. Du musst halt meinen Code zum speichern dann allerdings ja trotzdem verwenden, wenn du die Ini Datei ändern willst]

Poring 27. Jan 2008 13:26

Re: Verschlüsselte Ini lesen?
 
Dankeschön! Klappt besser als ichs erhofft hatte (also 110% ;) )

Ja das mit dem XORM etc. hatte ich auch nun gemerkt wo das hinmuss bzw das es hinmuss als ich den Code einfügt :)

Herzlichen dank, so schnell hätte ich das niemals hinbekommen :)

Zacherl 27. Jan 2008 13:28

Re: Verschlüsselte Ini lesen?
 
Bitte bitte kein Problem :)

Poring 27. Jan 2008 13:39

Re: Verschlüsselte Ini lesen?
 
Oki eine letzte Frage habe ich nun doch noch:
Ich habe den ganzen Code in Form.OnShow
Gibt es nun eine möglichkeit auf die Ini zuzugreifen wenn ich auf einen Button klicke oder muss ich den gesamten Code dort wieder einfügen?

edit:
Da wenn ich den Code in den ButtonClick erneut rein stelle, und ganz schnell auf den Button klicke gibt es Codeübersetzungsfehler


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Seite 2 von 3     12 3      

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