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}