![]() |
Re: Dateien verschlüsseln - aber wie?
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:
Ich möchte möglichst mit nur einer Quelldatei und einer Ausgabedatei arbeiten, damit nicht so viel auf dem Datenträger geschrieben wird.
// 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; 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. :wink: MfG, Daniel. :bounce2: |
Re: Dateien verschlüsseln - aber wie?
Und ich soll jetzt aus dem "durchwühlten" Code den Fehler raus machen oder wie? Dazu hab eich leider im Moment nicht den Nerv. Ich liege mit einer Erkältung im Bett.
|
Re: Dateien verschlüsseln - aber wie?
Hi.
1) Mit durchwühlt meinte ich nur, dass die Formatierung nicht immer 100%ig ist (hat Hagen mal kritisiert), ansonsten passt die Formatierung aber - vor Allem in dem Teil, der im Endeffekt wirklich wichtig ist. 2) Nach Bett sieht das nicht gerade aus. Oder du hast ein Notebook mit WLAN. :) 3) Ich hatte dich auch nur als Beispiel genannt, weil du dich auch mit der Materie des DEC auskennst und mit nicht mein ganzen Konzept zerstören würdest. Aber natürlich kann mir auch jede(r) Andere helfen. Fakt ist nur, dass ich alleine hier nicht mehr weiter komme. Und das ist ja dann nicht gerade gut. :( Danke euch allen! MfG, Daniel. |
Re: Dateien verschlüsseln - aber wie?
Man muß auch mal aufstehen.
|
Re: Dateien verschlüsseln - aber wie?
Delphi-Quellcode:
:) oder in kurz: SrcStream.Position = ScrcStream.Size nach Aufruf von Hash.CalcStream() usw. Du musst damit .EncodeStream() funktioniert also SrcStream.POsition := 0; vorher aufrufen. Alle Stream Funktionen sollten niemals Stream.Position selbständig verändern, sondern immer ausgehen von der akteuellen Position arbeiten. Damit wird es möglich in einen Stream z.B. per Bitmap.SaveToStream() mehrere Bitmaps hintereinander zu speichern.
FileHeader.HashString := DefHashClass.CalcStream(SrcStream, SrcStream.Size);
if SrcStream.Position <> SrcStream.Size then // Hash.CalcStream() hat nicht den Stream.Zeiger verändert und arbeitet somit falsch !! else // Hash.CalcStream() hat wie erwartet den Stream gelesen und somit ist der Streamzweiger amd // Ende des Stream. Der Programmier hat nun darauf zu achten das er per SrcStream.Position := 0; // wieder an den Anfang positionert FALLS er mit SrcStream weiter arbeiten muß. Da der Programmier // eigentlich die VCL kennen sollte müsste er auch wissen das dieses Verhalten immer so ist. // Denn er ist der jenige der denken kann und der VCL sagen muß was er will. Gruß Hagen |
Re: Dateien verschlüsseln - aber wie?
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:
[edit=Daniel B]Tags korrigiert. Mfg, Daniel B[/edit]
// 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; |
Re: Dateien verschlüsseln - aber wie?
Hallo,
inzwischen hab ich durch weitere Experimente herausgefunden, dass der Fehler nicht in der Verschlüsselung sondern lediglich in der Entschlüsselung liegt. Beim Verschlüsseln geht alles 100 pro. Mal sehen, ob ich die Entschlüsselung noch weiter analysieren kann... MfG, Daniel. |
Re: Dateien verschlüsseln - aber wie?
JJJJuuuuuhhhhuuuuu!!!!!!!!!!! :angle:
Hab's endlich geschafft! Man, da hab ich vor lauter Bäumen den Wald nicht mehr gesehen! :oops: Es lag so nahe... Mein Problem war: Da ich mit CopyFrom() nicht klar kam, hab ich erst LoadFromStream verwendet und anschließend dann den HashWert vorne eingefügt. Zumindest hatte ich es so vor... Delphi hat das etwas anders verstanden und mir dadurch den vorderen Teil der Datei überschreiben. Jetzt hab ich den Zeiger einfach vor der CopyFrom Operation in der Quelldatei auf SrcStream.Size gesetzt und schon konnte ich erst den Hash einfügen und anschließend mit CopyFrom die Quelldatei!!! Gemerkt hab ich das Ganze, indem ich mit Textfiles experimentiert hab und den Cipher abgeschaltet hatte. Da bin ich dann stutzig geworden, weil ich unterschiedliche Hash-Werte bekam und weil mir der Anfang der Datei fehlte. Egal, jetzt geht's jedenfalls!!! :firejump: Danke euch Allen, die ihr mich so tatkräftig unterstützt habt!!! :cheers: MfG, Daniel. PS: @Hagen: Wenn es dir nichts ausmacht, darf ich dir dann - nach erneuter Überarbeitung - meinen Source mal zuschicken? Ich möchte nur sichergehen, dass ich nicht irgendeinen groben Unsinn gemacht habe, der dann die ganze Sicherheit flöten gehen lässt... :wink: |
Re: Dateien verschlüsseln - aber wie?
Ich warte, ehrlich gesagt, immer noch darauf, wie ich an die CipherID / HashID rankomme, bzw. wie ich sie dann nutzen kann. :roll:
|
Re: Dateien verschlüsseln - aber wie?
Das weiß ich ehrlich gesagt auch nicht.
Aber mach es doch so: Deklarier dir die Variable DefCipherClass vom Typ TCipherClass, die dann automatisch die Werte TCipher_Rijndael, TCipher_Blowfish etc enthalten kann. Die speicherst du im Stream und kannst nach dem Laden dann sagen:
Delphi-Quellcode:
MfG,
with DefCipherClass.Create('',nil) do
begin HashClass := DefHashClass; InitKey(PW,nil); CodeStream(); Free; end; Daniel. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz