Einzelnen Beitrag anzeigen

Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 

Mit dem RC-Stromdekorierer INIs verschlüsseln

  Alt 12. Apr 2005, 00:02
Mit dem RC-Stromdekorierer INIs verschlüsseln

betreff: RC4 Stromdekorierer

Kürzlich erhielt ich dazu folgende frage...

Zitat von Jolomino:
hallo,
habe mir mal deinen post angeschaut, das dekodieren und kodieren funzt auch ganz wunderbar. aber könntest du mir evtl. verraten, wie ich dieses auf einer ini-datei anwende? bekomme es leider nicht hin. oder ist es womöglich überhaupt nicht auf ini´s anwendbar...

Die antwort:

Hallo jolomino,

normalerweise wäre dein vorhaben nicht möglich, da TIniFile kein stream ist. Der dekorator braucht aber nunmal ein stream, den er umschliessen kann. Allerdings gibt es die klasse TMemIniFile, welche für das speichern Stringlisten verwendet, die man dann verschlüsseln kann. Also machen wir eine neue klasse. Allerdings müssen dafür einige methoden ersetzt werden. LoadValue zb. ist nicht virtuell und kann daher nicht überschrieben werden, also Kann man einfach die stellen ersetzen wo loadValue aufgerufen wird und dann das neue LoadValue aufrufen. In demfall müssen also Create und Rename ersetzwerden. UpdateFile ist virtuell und kann überschrieben werden, ohne es zu vererben.

WICHTIG: die RCx klasse von hagen wird auch benötigt.

Also hier die klasse:

Delphi-Quellcode:

// RCx inifile unit.
// written by maximov (max hue) 2005.
// Inspiration by Jolomino.
// free for all, without warrenty.
// 12.04.2005 - fixes


unit RCmxIni;

interface

uses
   inifiles;

type
   TRCxIniFile = class(TMemIniFile)
   private
      FFileName:string;
      FPassword:string;
      procedure LoadValues;
   protected
   public
      constructor Create(const FileName, PassWord: string);
      procedure UpdateFile; override;
      procedure Rename(const FileName: string; Reload: Boolean);
      destructor Destroy; override;
   end;

implementation

uses
   classes,
   RCStreamDeco,
   sysUtils;


constructor TRCxIniFile.Create(const FileName, PassWord: string);
begin
   FFileName := FileName;
   FPassWord := PassWord;

   // instance sauber erzeugen, aber durch '' keine values laden
   inherited Create('');

   // neues loadValue eingeführt, mit RCx
   LoadValues;
end;

destructor TRCxIniFile.Destroy;
begin
   FPassword := '';
   inherited;
end;

procedure TRCxIniFile.Rename(const FileName: string; Reload: Boolean);
begin
   FFileName := FileName;
   if Reload then
      LoadValues;
end;

procedure TRCxIniFile.LoadValues;
var
   List: TStringList;
   rcxStream:TRCxStreamDecorator;
begin
   if (FFileName <> '') and FileExists(FFileName) then
   begin
      List := TStringList.Create;
      try
         // Filestream, von RCx-dekorierer gewrappt, erzeugen.
         rcxStream := TRCxStreamDecorator.Create(
            TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone),
            true,
            FPassword);
         try
            // salz lesen -> zur besseren sicherheit
            rcxStream.ReadSalt;
            // entschlüsselnd laden
            List.LoadFromStream(rcxStream);
            SetStrings(List);
         finally
            rcxStream.Free;
         end;
      finally
         List.Free;
      end;
   end
   else
      Clear;
end;

procedure TRCxIniFile.UpdateFile;
var
   List: TStringList;
   rcxStream:TRCxStreamDecorator;
begin
   List := TStringList.Create;
   try
      // stream erzeugen.
      rcxStream := TRCxStreamDecorator.Create(
            TFileStream.Create(FFileName, fmCreate),
            true,
            FPassword);
      try
         GetStrings(List);
         // salz mit zufälliger länge schreiben -> erhöht die sicherheit
         rcxStream.WriteSalt(16 + random(32));
         List.SaveToStream(rcxStream);
      finally
         rcxStream.Free;
      end;
   finally
      List.Free;
   end;
end;



end.
Musst halt nur updateFile selbst aufrufen! Aber ansonsten hast du somit eine verschlüsselte ini-Datei. Wenn du willst kannst du unit auch gerne in der codeLib veröffentlichen, damit vielleicht auch andere was davon haben.

Viel spass damit und wenn fragen sind, immer her damit.

grüsse maximov.


Edit: Kleine verbesserungen von Hagen eingebaut. Danke!

[edit=Chakotay1308]SID aus Link entfernt. Mfg, Chakotay1308[/edit]
mâxîmôv.

{KDT}
  Mit Zitat antworten Zitat