Delphi-PRAXiS

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)

Poring 27. Jan 2008 12:06


Verschlüsselte Ini lesen?
 
Hallo,

ich habe eine Inidatei verschlüsselt
z.B:
Delphi-Quellcode:
davor:
[Name]
Eintrag1=Test

danach:
wasanders
auchwasanderes=wasanderes
Die Inidatei möchte ich jedoch trozdem auslesen mit:
Delphi-Quellcode:
i:=ini.ReadString('Name', 'Eintrag1', '');
Ist es irgendwie möglich die Inidatei wieder zu entschlüsseln und dann erst die Daten zu lesen?
Natürlich soll die Ini als entschlüsselte Datei nicht gespeichert werden.

Danke für Tipps,
Mfg

mkinzler 27. Jan 2008 12:11

Re: Verschlüsselte Ini lesen?
 
Wie hast du verschlüsselt? Einfach umkehren

Poring 27. Jan 2008 12:13

Re: Verschlüsselte Ini lesen?
 
Verschlüsselt einfach damit, dass die Zeichen vertauscht wurden.

Klar kann ich dieses wieder umkehere, nur wie mache ich dies damit er die umkehrung nicht in der Ini speichert (damit die Ini noch verschlüsselt bleibt) aber er dann die Daten aus dem entschlüsseltem liest?
Weil ich kann in der verschlüsselten Ini ja nicht mehr den Wert auslesen, da ja auch [Name] und Eintrag1 verschlüsselt ist.

Die Muhkuh 27. Jan 2008 12:15

Re: Verschlüsselte Ini lesen?
 
Anstatt Du die Datei ins Dateisystem schreibst, kannst Du sie in einem TMemoryStream abspeichern und von dort auch wieder (entschlüsselt) laden.

Poring 27. Jan 2008 12:19

Re: Verschlüsselte Ini lesen?
 
Und daraus kann ich dann die Daten auch so gezielt auslesen? Also irgendwie mit
Delphi-Quellcode:
i:=memorystream.ReadString('Name', 'Eintrag1', '');
Oder geht dies dan anders?

Die Muhkuh 27. Jan 2008 12:24

Re: Verschlüsselte Ini lesen?
 
Nein, Du entschlüsselst die Ini-Datei und anstatt Du die entschlüsselte Datei auf die Festplatte speicherst, speicherst Du sie in einen TMemoryStream. Danach kannst Du über Ini.LoadFromStream die entschlüsselte Datei vom TMemoryStream laden.

Vielleicht zeigst mal grob, wie Du verschlüsselst. Vielleicht machst Du das anders, als ich es gerade im Kopf habe. Dann haut meine Lösung nicht hin.

Zacherl 27. Jan 2008 12:26

Re: Verschlüsselte Ini lesen?
 
Schritte:

1) INI Datei als Pointer in den Speicher laden (MemoryStream)
2) Speicherbereich entschlüsseln
3) Speicherbereich der MemoryIniFile zuordnen (LoadFromStream)
4) Normal mit der INI arbeiten
5) Speicherbereich verschlüsseln
6) Daten in der INI speichern

Poring 27. Jan 2008 12:29

Re: Verschlüsselte Ini lesen?
 
Verschlüssel/Entschlüsseln:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  i: Integer;
begin
  s:=memo1.Text;
  for i:=1 to length(s) do
    s[i]:=char(23 Xor Ord(s[i]));
  memo1.Text:=s;


end;
Damit habe ich den Text der in die Ini kommt verschlüsselt (stand in nem Memofeld).
Dh in der Ini steht anstatt
Delphi-Quellcode:
[Name]
Eintrag1=Test
steht nun:
Delphi-Quellcode:
LYvzrJR~ycevp&*Crdc
zu Zacherl:
Mit Schritt 4: mit der verschlüsselten normalen Ini weiterarbeiten oder wie soll dies funktionieren?

Zacherl 27. Jan 2008 12:31

Re: Verschlüsselte Ini lesen?
 
Die Datei ist zwar auf der Festplatte noch verschlüsselt, intern im Speicher deiner Anwendung aber nicht mehr. Von daher funktioniert das auch ..

mkinzler 27. Jan 2008 12:32

Re: Verschlüsselte Ini lesen?
 
Warum verschlüsselst du die Ini am Stück anstatt Teilweise:

aus
[Name]
Eintrag1=Test

[lsdlksakl]
kkldslkdfkl=dhshsh

Dann könntest du es auch einfach wieder entschlüsseln.

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

mkinzler 27. Jan 2008 13:41

Re: Verschlüsselte Ini lesen?
 
Pack den Code in eine Fuktion/Prozedur und rufe diese dann auf.

Poring 27. Jan 2008 13:43

Re: Verschlüsselte Ini lesen?
 
Wie Packe ich dies in eine ganze Prozedur?
Bzw wenn ich dies tue und klicke immerwieder auf den Button wird die Ini ja auch immer wieder erneut umgewandelt oder nicht?
Wäre irgendwie sinvoll wenn ich auf die Ini solange zugreifen kann wie das Programm läuft, geht das? (Mit der Prozedur?)

Zacherl 27. Jan 2008 13:44

Re: Verschlüsselte Ini lesen?
 
Also Statt OnShow würde ich dir OnCreate raten. Du könntest auch einfach globale Variablen anlegen und direkt ALLE Werte direkt zum Programmstart auslesen. Dann benötigst du die Ini hinterher gar nicht mehr und kannst stattdessen direkt auf die globalen Werte zugreifen.

mkinzler 27. Jan 2008 13:44

Re: Verschlüsselte Ini lesen?
 
Lade den Inhalt am Programmstart in Variablen ein.

Poring 27. Jan 2008 13:46

Re: Verschlüsselte Ini lesen?
 
Das wäre eine möglichkeit, aber ich lese die Daten dan mit einer ComboBox aus, also wenn ich dies auswähle brauch ich das. Wenn ich am Anfang gleich alles auslese ... naja das wäre ziemlich viel. Deswegen ja die ComboBox wo dan nur das gebraucht ausgelesen wird.
Oder ist das anders nicht möglich?

mkinzler 27. Jan 2008 13:49

Re: Verschlüsselte Ini lesen?
 
In diesem Fall würde ich statt Ini ne Datenbank nehmen.

Poring 27. Jan 2008 14:02

Re: Verschlüsselte Ini lesen?
 
Ich möchte ja eine unabhängige datei zur Exe haben ...
Nur scheint es so das wenn ich eben schnelle wehcsel mache es zu Problemen kommt bei der Ini entschlüsselung :(

Gibts denn so keine Möglichkeit die Ini wärend dem Programmstart offen zu lassen bzw das er bei der ComboBoy wenn man etwas auswählt sie nicht jedes mal neu Entschlüsseln muss?

edit:
es scheint das der Entschlesselungsfehler kam da das Wort das letzte in der Ini war. Ich habe einfach noch eine Zeile drutner etwas geschrieben was ncith aufgerufen wird... nun gehts. Und angezeigt wird dies erst wenn man auf einen Button klickt, der sich den Namen aus der ComboBox holt.

Danke Euch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:24 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