AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien verschlüsseln - aber wie?

Ein Thema von daniel-volk · begonnen am 27. Sep 2003 · letzter Beitrag vom 14. Mär 2004
Antwort Antwort
Seite 8 von 11   « Erste     678 910     Letzte »    
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#71

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 19:42
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#72

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 20:01
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#73

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 20:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#74

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 20:32
Man muß auch mal aufstehen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#75

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 21:24
Delphi-Quellcode:
  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.
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.

Gruß Hagen
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#76

Re: Dateien verschlüsseln - aber wie?

  Alt 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]
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#77

Re: Dateien verschlüsseln - aber wie?

  Alt 7. Okt 2003, 17:51
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.
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#78

Re: Dateien verschlüsseln - aber wie?

  Alt 7. Okt 2003, 18:35
JJJJuuuuuhhhhuuuuu!!!!!!!!!!!

Hab's endlich geschafft!
Man, da hab ich vor lauter Bäumen den Wald nicht mehr gesehen!
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!!!

Danke euch Allen, die ihr mich so tatkräftig unterstützt habt!!!

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#79

Re: Dateien verschlüsseln - aber wie?

  Alt 7. Okt 2003, 20:26
Ich warte, ehrlich gesagt, immer noch darauf, wie ich an die CipherID / HashID rankomme, bzw. wie ich sie dann nutzen kann.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#80

Re: Dateien verschlüsseln - aber wie?

  Alt 7. Okt 2003, 21:38
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:
with DefCipherClass.Create('',nil) do
begin
  HashClass := DefHashClass;
  InitKey(PW,nil);
  CodeStream();
  Free;
end;
MfG,
Daniel.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 8 von 11   « Erste     678 910     Letzte »    


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 08:01 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