Registriert seit: 16. Jul 2003
170 Beiträge
Delphi 6 Enterprise
|
Re: Dateien verschlüsseln - aber wie?
7. Okt 2003, 17:04
Hi,
hab Hagen's Rat mal befolgt, aber immer noch ohne Erfolg.
Ich kriege zwar keine Fehlermeldung mehr, aber ansonsten geht es immer noch nicht:
Die Ausgabedatei ist nicht mehr das, was sie mal war.
Ok, muss jetzt weg. Guckt euch den Code mal an.
Eigentlich fehlt mir doch nur eine Funktion zum Löschen eines Streamstücks. Und die hab ich nicht.
Vielleicht sind da aber auch noch andere Fehler?!
MfG,
Daniel.
Danke!!!
Delphi-Quellcode:
// Datei verschlüsseln
function TFrmCipher.EncodeFile(Input, Output, Passwd: String; hWnd: THandle): Boolean;
var
SrcStream: TStreamProgressAdapter;
DestStream: TFileStream;
TempStream: TMemoryStream;
FileHeader : TFileHeader;
begin
result := False;
SrcStream := TStreamProgressAdapter.Create(TFileStream.Create(Input, fmOpenRead or fmShareDenyNone), hWnd);
if Assigned(SrcStream) then
begin
try
DestStream := TFileStream.Create(Output, fmCreate);
if Assigned(DestStream) then
begin
try
TempStream := TMemoryStream.Create;
if Assigned(TempStream) then
begin
try
SrcStream.Seek(0,sofrombeginning);
// Anhand von SrcStream soll der FileHash berechnet werden...
FileHeader.HashString := DefHashClass.CalcStream(SrcStream, SrcStream.Size, nil, DefFileStringFormat);
// TempStream übernimmt die Rolle von SrcStream
TempStream.LoadFromStream(SrcStream);
TempStream.Seek(0,sofrombeginning);
// Der FileHeader wird in TempStream vor die eigentlichen Daten geschrieben (geht das so???)
TempStream.Write(FileHeader, sizeof(TFileHeader));
TempStream.Seek(0,sofrombeginning);
DestStream.Seek(0,sofrombeginning);
with DefCipherClass.Create('', nil) do
begin
Mode := DefCipherMode;
HashClass := DefHashClass;
InitKey(Passwd, nil);
EncodeStream(TempStream, DestStream, TempStream.Size);
end;
finally
FreeAndNil(TempStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(DestStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(SrcStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
result := True;
end;
// Datei entschlüsseln
function TFrmCipher.DecodeFile(Input, Output, Passwd: String; hWnd: THandle): Boolean;
var
SrcStream: TStreamProgressAdapter;
DestStream: TFileStream;
TempStream : TMemoryStream;
NewHeader, OldHeader : TFileHeader;
begin
result := False;
SrcStream := TStreamProgressAdapter.Create(TFileStream.Create(Input, fmOpenRead or fmShareDenyNone), hWnd);
if Assigned(SrcStream) then
begin
try
DestStream := TFileStream.Create(Output, fmCreate);
if Assigned(DestStream) then
begin
try
TempStream := TMemoryStream.Create;
if Assigned(TempStream) then
begin
try
with DefCipherClass.Create('', nil) do
begin
Mode := DefCipherMode;
HashClass := DefHashClass;
InitKey(Passwd, nil);
// Zuerst wird SrcStream Decodiert und in TempStream geschrieben
DecodeStream(SrcStream, TempStream, SrcStream.Size);
// jetzt befindet sich am Anfang von TempStream der FileHeader
Free;
end;
TempStream.Seek(0,sofrombeginning);
// Der FileHeader wird gelesen
TempStream.Read(OldHeader,SizeOf(TFileHeader));
// Problem: Der Rest der Datei hinter dem Header muss in DestStream geschrieben werden!!!
// Habe auch schon Write() versucht
DestStream.CopyFrom(TempStream,TempStream.Size-TempStream.Position);
DestStream.Seek(0,sofrombeginning);
NewHeader.HashString := DefHashClass.CalcStream(DestStream, DestStream.Size, nil, DefFileStringFormat);
finally
FreeAndNil(TempStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(DestStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(SrcStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
If NewHeader.HashString = OldHeader.HashString then
result := true else
result := false;
end;
[edit=Daniel B]Tags korrigiert. Mfg, Daniel B[/edit]
|