So den ersten versuch habe ich mit
DEC versucht zu realisieren, jedoch weiß ich nicht so ganz wie ich das mit dem
Stream genau händeln muß, zur Zeit erhalte ich immer eine Fehlermeldung (Stream-Lese Fehler)
Delphi-Quellcode:
var
ACipherClass : TDECCipherClass = TCipher_Rijndael;
ACipherMode : TCipherMode = cmCBCx;
AHashClass : TDECHashClass = THash_Whirlpool;
AKDFIndex : LongWord = 1;
procedure pSaveFile(const sFileName: String; _MyFile: tKeyFile);
var
MStream : TMemoryStream;
FStream : TFileStream;
ASalt : Binary;
AData : Binary;
APass : Binary;
begin
MStream := TMemoryStream.Create;
try
//In den MemoryStream schreiben
MStream.WriteBuffer(_MyFile.Header, SizeOf(_MyFile.Header));
MStream.WriteBuffer(_MyFile.Param, SizeOf(_MyFile.Param));
//FileStream erzeugen
FStream := TFileStream.Create(sFileName, fmCreate or fmShareExclusive);
try
with ValidCipher(ACipherClass).Create, Context do
try
ASalt := RandomBinary(16);
APass := ValidHash(AHashClass).KDFx(glFileCryptPassword[1], Length(glFileCryptPassword) * SizeOf(glFileCryptPassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Mode := ACipherMode;
Init(APass);
EncodeStream(MStream, FStream, MStream.Size);
finally
Free;
ProtectBinary(ASalt);
ProtectBinary(AData);
ProtectBinary(APass);
end;
finally
FStream.Free;
end;
finally
MStream.Free;
end;
end;{pSaveFile}
Im zweiten Versuch habe ich versucht das Konzept des Stromdekorierer zu realisieren. Jedoch erhalte ich hier auch noch
Fehlermeldungen (im Debug modus). Compilier ich das ganze im Release Modus kann ich zwar die Datei verschlüsselt speichern
jedoch beim öffnen ist alles durcheinander und mein Rekord wird nicht so wiederhergestellt wie ich es zuvor gespeichert habe.
Delphi-Quellcode:
procedure pOpenFile(const sFileName: String; Var _MyFile: tKeyFile; Var bError: Boolean);
var
FStream : TRCxStreamDecorator;
begin
//init
_MyFile.Header.FileFormatVersion := 0;
bError := False;
FStream := TRCxStreamDecorator.Create(TFileStream.Create(sFileName, fmOpenRead or fmShareExclusive), True, '1234', emEncodeReading);
try
try
//Header
FStream.ReadBuffer(_MyFile.Header, SizeOf(_MyFile.Header));
if _MyFile.Header.FileFormatVersion = CurrentVersion then begin
//Parameter
FStream.ReadBuffer(_MyFile.Param, SizeOf(_MyFile.Param));
end
else begin
Application.MessageBox(PWideChar('Die Datei entspricht nicht dem aktuellen Datei-Format ('+IntToStr(CurrentVersion)+')'), 'Fehler', 48);
bError := True;
end;{else}
except
bError := True;
end;
finally
FStream.Free;
end;
end;{pOpenFile}
Delphi-Quellcode:
procedure pSaveFile(const sFileName: String; _MyFile: tKeyFile);
var
FStream : TRCxStreamDecorator;
begin
FStream := TRCxStreamDecorator.Create(TFileStream.Create(sFileName, fmCreate or fmShareExclusive), True, '1234', emEncodeWriting);
try
//Header
FStream.WriteBuffer(_MyFile.Header, SizeOf(_MyFile.Header));
//Parameter
FStream.WriteBuffer(_MyFile.Param, SizeOf(_MyFile.Param));
finally
FStream.Free;
end;
Die Fehlermeldung verweist auf eine Prozedur in der RCx.pas...
Delphi-Quellcode:
procedure RC4Init(var RC4: TRC4Context; const Key: String);
var
R,S,T,K: Byte;
U,L: Integer;
begin
L := Length(Key);
with RC4 do
begin
I := 0;
J := 0;
for S := 0 to 255 do D[S] := S;
R := 0;
U := 0;
for S := 0 to 255 do
begin
if U < L then K := PByteArray(Key)[U] else K := 0;
Inc(U);
if U >= L then U := 0;
Inc(R, D[S] + K); //<-- Integer Überlauf
T := D[S];
D[S] := D[R];
D[R] := T;
end;
end;
end;