AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi DEC Verschlüsselung beim Speichern einer Datei
Thema durchsuchen
Ansicht
Themen-Optionen

DEC Verschlüsselung beim Speichern einer Datei

Ein Thema von TUX_der_Pinguin · begonnen am 16. Jun 2009 · letzter Beitrag vom 18. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#1

DEC Verschlüsselung beim Speichern einer Datei

  Alt 16. Jun 2009, 14:44
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
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 16. Jun 2009, 18:09
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. http://www.delphipraxis.net/internal...t.php?p=526663.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 16. Jun 2009, 23:45
Hallo Tux,

letzte Woche stand ich vor einer ähnlichen Suche welche Methode am besten wäre um ausgelagterte Dateien zu verschlüsseln.

Mir hatte jfheins sein Tip sehr geholfen, insbesondere auch für die Zukunft.
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.
Schau mal diesen Thread

Edit: Schlagwort wäre: Stromdekorierer
An dieser Stelle mal ein großes Dankeschön an negaH und maximov für diese sehr aufwendige, tolle Arbeit!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 10:40
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;
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 10:51
Hallo Tux,

auf die Schnelle meine ich mich zu erinnern, dass man in deiner Procedur procedure pSaveFile...
das -> FStream.WriteBuffer...
nur einmal aufrufen darf.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 11:02
Nee also das klappt auch irgendwie nicht, ausserdem habe ich ja noch nach wievor einen Integerüberlauf in der RCx.pas.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#7

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 11:15
zum Integerüberlaug: du hast nicht zufällig die Unit aus dem Anhang verwendet?
http://www.delphipraxis.net/internal...049637#1049637

wenn ja, dann such mal in RCx.pas diese Zeile
{ $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 lösche das leerzeichen zwischen { und $


und wegen dem "ist alles durcheinander im Record" ... hab in dem Thread da drüben das selbe Problem.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 11:33
Zitat von himitsu:
zum Integerüberlaug: du hast nicht zufällig die Unit aus dem Anhang verwendet?
http://www.delphipraxis.net/internal...049637#1049637

wenn ja, dann such mal in RCx.pas diese Zeile
{ $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 lösche das leerzeichen zwischen { und $


und wegen dem "ist alles durcheinander im Record" ... hab in dem Thread da drüben das selbe Problem.

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.
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 17. Jun 2009, 17:25
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.



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...

Edit 2: (18.06.09) Hinweise seitens himitsu in das Testprojekt mit übernommen und Kleinigkeiten verschlimmbessert
Angehängte Dateien
Dateityp: zip test_rcx_stromdekorierer_379.zip (358,5 KB, 25x aufgerufen)
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
608 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: DEC Verschlüsselung beim Speichern einer Datei

  Alt 18. Jun 2009, 07:59
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:
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}
Wie gut bzw. wie sicher die Verschlüsselung jetzt ist, soll mir soweit egal sein. Als Passwort werde ich natürlich
etwas anders nehmen als "1234" 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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz