![]() |
DEC Verschlüsselung beim Speichern einer Datei
Hallo DPler,
ich habe heute angefangen mich ein wenig mit dem Thema DEC zu beschäftigen, da ich gern etwas verschlüsselt haben möchte. Ich habe mir ein kleines Tool geschrieben, dieses Tool speichert ein Rekord ab, dieser soll jedoch verschlüsselt werden um eine manipulation durch einen Hex-Editor auszuschließen. Ich hatte mir gedacht ich speicher zu erst den Rekord in einem MemoryStream ab um ihn dann zu verschlüsseln und anschließend in einer Datei zu speichern. Beim laden müßte das dann umgekehrt sein, also aus der Datei den verschlüsselten MemoryStream laden diesen entschlüsseln und dann daraus das Rekord zu laden. Jedoch fehlt mir noch so der Ansatz wie ich die Verschlüsselung realisieren muß, ich blick da leider noch nicht so ganz durch. Verwendete Software: DEC 5.2 Delphi 2009 Professional
Delphi-Quellcode:
procedure pSaveFile(const sFileName: String; _MyFile: tKeyFile);
var MStream : TMemoryStream; FStream : TFileStream; CipherManager : TDECCipher; begin CipherManager := TDECCipher.Create; try 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 CipherManager.EncodeStream(MStream, FStream, MStream.Size); finally FStream.Free; end; finally MStream.Free; end; finally CipherManager.Free; end; end;{pSaveFile} mfg TUX |
Re: DEC Verschlüsselung beim Speichern einer Datei
Hi Tux,
in der DEC 5.2 befindet sich ein Beispiel (eigentlich für Unicode), müßte Example.txt oder so heißen um im Hauptverzeichnis liegen. Schau Dir das mal an, die Funktionen sind im Prinzip für Streams ähnlich, nur daß Du .Encode/.DecodeBinary gegen .Encode/.DecodeStream tauscht. Ansonsten sollten sich auch hier im Forum einige Beispiele zur DEC5 und Streams bzw. Dateien finden lassen, z.B. ![]() Gruß Assertor |
Re: DEC Verschlüsselung beim Speichern einer Datei
Hallo Tux,
letzte Woche stand ich vor einer ähnlichen Suche welche Methode am besten wäre um ausgelagterte Dateien zu verschlüsseln. Mir hatte ![]() Das Ganze lässt sich leicht einbinden und der Ansatz den Stream bei den Standard LoadFromStream- oder SaveToStream-Methoden zu encodieren bzw. zu kodiern gefällt mir sehr gut. ![]() Edit: Schlagwort wäre: Stromdekorierer An dieser Stelle mal ein großes Dankeschön an ![]() ![]() |
Re: DEC Verschlüsselung beim Speichern einer Datei
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:
Die Fehlermeldung verweist auf eine Prozedur in der RCx.pas...
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;
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; |
Re: DEC Verschlüsselung beim Speichern einer Datei
Hallo Tux,
auf die Schnelle meine ich mich zu erinnern, dass man in deiner Procedur procedure pSaveFile... das -> FStream.WriteBuffer... nur einmal aufrufen darf. |
Re: DEC Verschlüsselung beim Speichern einer Datei
Nee also das klappt auch irgendwie nicht, ausserdem habe ich ja noch nach wievor einen Integerüberlauf in der RCx.pas.
|
Re: DEC Verschlüsselung beim Speichern einer Datei
zum Integerüberlaug: du hast nicht zufällig die Unit aus dem Anhang verwendet?
![]() wenn ja, dann such mal in RCx.pas diese Zeile
Delphi-Quellcode:
und lösche das leerzeichen zwischen { und $ :angel2:
{ $A+,B-,C-,D-,E-,F-,G+,H+,I-,J+,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U+,V+,W-,X+,Y-,Z1}
und wegen dem "ist alles durcheinander im Record" ... hab in dem Thread da drüben das selbe Problem. |
Re: DEC Verschlüsselung beim Speichern einer Datei
Zitat:
Ja ich hab die Unit genommen, ok muß ich mal schauen das ich das Leerzeichen entferne. Hmm ist blöd wäre zu schön wenns so klappen würde ... ich hoffe es gibt da eine Lösung. |
Re: DEC Verschlüsselung beim Speichern einer Datei
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
wir reden im Moment von 2 verschiedenen Problemen (Unicode-Thematik und das Nichtfunktionieren des Stromdekorierers bei Tux) Zur Veranschaulichung wie der Strom Dekorierer bei mir funktioniert habe ich mal ein Projekt erstellt (im Anhang). Ich habe mich in diesem Test-Projekt für das Erstellen einer abgeleiteten StringList entschieden. Nur von dieser StringList werden dann die beiden Methoden SaveToFile() und LoadFromFile() "umgeleitet" auf die Ver- und Entschlüsselungs-Methoden. So lässt sich das Ganze sehr schön verwenden. :-D Edit 1: (17.06.09) Neues Test-Projekt angefügt. Nun wird: a) beim Start des Programmes eine evtl. vorhandene, verschlüsselte Datei direkt in die StringList und dann in die Listbox eingelesen, b) Fehlerbehandlung wenn bei der Methode LoadFromFile() keine Datei vorhanden ist... :wink: Edit 2: (18.06.09) Hinweise seitens himitsu in das Testprojekt mit übernommen und Kleinigkeiten verschlimmbessert :mrgreen: |
Re: DEC Verschlüsselung beim Speichern einer Datei
Vielen dank für das Beispiel juergen, ich habs jetzt hin bekommen, jedoch mußte ich nicht nur in der RCx.pas
die Kompilerschalter aktivieren sondern in den beiden anderen Units auch weil ich ständig Integerüberlaufe bekommen habe. Die Verschlüsselung scheint jetzt aber zu funktionieren, ich kann mein Rekord speichern und wenn ich es wieder lade ist das Rekord wieder vollständig hergestellt. Im grunde fehlte nur WriteSalt und ReadSalt. Speichern der Datei:
Delphi-Quellcode:
procedure pSaveFile(const sFileName: String; _MyFile: tKeyFile);
var FStream : TRCxStreamDecorator; begin FStream := TRCxStreamDecorator.Create(TFileStream.Create(sFileName, fmCreate or fmShareExclusive)); try FStream.Password := '1234'; FStream.WriteSalt; //Header FStream.WriteBuffer(_MyFile.Header, SizeOf(_MyFile.Header)); //Parameter FStream.WriteBuffer(_MyFile.Param, SizeOf(_MyFile.Param)); finally FStream.Free; end; end;{pSaveFile} Öffnen der Verschlüsselten Datei:
Delphi-Quellcode:
Wie gut bzw. wie sicher die Verschlüsselung jetzt ist, soll mir soweit egal sein. Als Passwort werde ich natürlich
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)); try try FStream.Password := '1234'; FStream.ReadSalt; //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;{try..except} finally FStream.Free; end;{try..finally} end;{pOpenFile} etwas anders nehmen als "1234" :wink: aber mir ging es nur darum die jenigen abzuschrecken die mal probieren wollen ob man da nicht was manipulieren kann wenn man einen Wert ändert, da in meinem Rekord fast nur Boolschewerte gespeichert werden, hätte man ja das ein oder andere Byte mal umdrehen können von daher ist das jetzt vollkommen in Ordnung. Ich bedanke mich bei der tollen hilfe und wünsche noch einen schönen Tag. mfg TUX |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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