Einzelnen Beitrag anzeigen

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