Ich glaub ich spinne:
Warum wollen diese Streams nicht so wie ich will?
Ich hab Luckie's Art die Files zu ver- und entschlüsseln mal etwas abgewandelt. Und zwar habe ich als Random-Ersatz den Hash-Wert mit in der Datei gespeichert.
Aber das führt nur zu Fehlern:
Die Version des Quelltextes, die ich euch jetzt vorlege, die führt gleich zu einem Fehler. Ich hatte schon einige Sachen geändert, die dann bewirkt haben, dass es keine Fehlermeldung mehr gab (beum Verschlüsseln). Aber es ging trotzdem nie richtig! Es wurden dann halt völlig falsche Daten gespeichert.
Zugegeben: Das sind meine ersten Versuche mit Streams zu arbeiten. Hab auch schon bei Delphi-Source ein Tutorial gelesen, aber mein Hauptproblem, dass ich nicht von einem Stream zu anderen kopieren kann (CopyFrom geht nicht), das kriege ich auch nicht behoben.
@ Luckie:
Ich weiß ja, dass du mit Streams ganz gut umgehen kannst. Kannst du mir an dieser Stelle vielleicht helfen? Das ist (hoffentlich) die letzte Hürde, die mir vor der Fertgstellung noch bevorsteht.
Danke!!!!!!!!
So, hier der Code:
Delphi-Quellcode:
// 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), hWnd);
if Assigned(SrcStream) then
begin
try
DestStream := TFileStream.Create(Output, fmCreate);
if Assigned(DestStream) then
begin
try
TempStream := TMemoryStream.Create;
if Assigned(DestStream) then
begin
try
SrcStream.Seek(sizeof(TFileHeader), soFromBeginning);
with DefCipherClass.Create('', nil) do
begin
Mode := DefCipherMode;
HashClass := DefHashClass;
InitKey(Passwd, nil);
DecodeStream(SrcStream, TempStream, SrcStream.Size);
end;
TempStream.Position := 0;
TempStream.Read(OldHeader,SizeOf(TFileHeader));
TempStream.Seek(SizeOf(TFileHeader),0);
DestStream.Write(TempStream,DestStream.Size);
NewHeader.HashString := DefHashClass.CalcStream(DestStream, DestStream.Size);
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;
// Datei verschlüsseln
function TFrmCipher.EncodeFile(Input, Output, Passwd: String; hWnd: THandle): Boolean;
var
SrcStream: TStreamProgressAdapter;
DestStream: TFileStream;
TempStream: TMemoryStream;
FileHeader : TFileHeader;
len : Int64;
rem : string;
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
FileHeader.HashString := DefHashClass.CalcStream(SrcStream, SrcStream.Size);
TempStream.Write(FileHeader, sizeof(TFileHeader));
TempStream.Write(SrcStream, SrcStream.Size);
with DefCipherClass.Create('', nil) do
begin
Mode := DefCipherMode;
HashClass := DefHashClass;
InitKey(Passwd, nil);
EncodeStream(TempStream, DestStream, SrcStream.Size);
end;
finally
FreeAndNil(DestStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(TempStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
finally
FreeAndNil(SrcStream);
end;
end
else
begin
RaiseLastOSError();
exit;
end;
result := True;
end;
Ich möchte möglichst mit nur einer Quelldatei und einer Ausgabedatei arbeiten, damit nicht so viel auf dem Datenträger geschrieben wird.
Das Teil soll nämlich so sein, dass man es auch auf'm USB-Stick verwenden kann, ohne dass es zu viele Schreibzyklen benötigt. Deshalb arbeite ich auch mit dem Memory-Stream.
Und bevor ich von Hagen wieder einen drauf kriege:
Ich hab den Code noch nicht groß formatiert. Sieht also so durchwühlt aus, wie es halt beim Experimentieren ist.
MfG,
Daniel.