Einzelnen Beitrag anzeigen

daniel-volk

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

Re: Dateien verschlüsseln - aber wie?

  Alt 6. Okt 2003, 18: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