Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   DEC Stream Entschlüsselung schlägt fehl (https://www.delphipraxis.net/148648-dec-stream-entschluesselung-schlaegt-fehl.html)

Luckie 5. Mär 2010 21:03


DEC Stream Entschlüsselung schlägt fehl
 
So sieht meine Methode aus, um einen Stream zu verschlüsseln und diesen dann aneine Datei zu hängen:
Delphi-Quellcode:
procedure TAppendFile.AppenEncrypted;
var
  fsCarrier: TFileStream;
  fsTrailer: TFileStream;
  EncryptStream: TMemoryStream;
  Salt: Binary;
  Key: Binary;
  FileInfo: TFileInfo;
begin

  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenWrite);
  try
    fsTrailer := TFileStream.Create(FTrailerFile, fmOpenRead);
    try
      EncryptStream := TMemoryStream.Create;
      with ValidCipher(ACipherClass).Create, Context do
      try
        Salt := RandomBinary(16);
        Key := ValidHash(AHashClass).KDFx(FPassWord, Salt, KeySize, TFormat_Copy, AKDFIndex);
        Mode := ACipherMode;
        Init(Key);
        // Salt zuerst in Dest speichern, lässt sich in .Decrypt besser laden
        EncryptStream.Write(Salt[1], Length(Salt));
        EncodeStream(fsTrailer, EncryptStream, fsTrailer.Size, nil);
      finally
        FileInfo.FFilename := ExtractFilename(FTrailerFile);
        FileInfo.FFileSize := EncryptStream.Size;
        EncryptStream.Seek(0, soFromBeginning);
        fsCarrier.Seek(fsCarrier.Size, soFromBeginning);
        fsCarrier.CopyFrom(EncryptStream, EncryptStream.Size);
        Free;
        EncryptStream.Free;
        ProtectBinary(Salt);
        ProtectBinary(Key);
      end;
    finally
      fsTrailer.Free;
    end;
  finally
    fsCarrier.Free;
  end;
  AppendFileInfo(FileInfo);
end;
Das funktioniert auch.

Folgende Methode soll dann den Stream wieder aus der Datei lesen und entschlüsseln:
Delphi-Quellcode:
procedure TAppendFile.ExtractEncrypted;
var
  fsCarrier: TFileStream;
  fsTrailer: TFileStream;
  EncryptStream: TMemoryStream;
  Salt: Binary;
  Key: Binary;
begin
  ReadFileInfo;
  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenRead);
  try
    fsCarrier.Seek(-SizeOf(TFileInfo) - FileInfo.FFileSize, soFromEnd);
    fsTrailer := TFileStream.Create(DestFolder + FileInfo.FFilename, fmCreate);
    try
      EncryptStream := TMemoryStream.Create;
      with ValidCipher(ACipherClass).Create, Context do
      try
        EncryptStream.CopyFrom(fsCarrier, FileInfo.FFileSize);
        SetLength(Salt, 16);
        EncryptStream.Read(Salt[1], Length(Salt));
        Key := ValidHash(AHashClass).KDFx(FPassword, Salt, KeySize, TFormat_Copy, AKDFIndex);
        Mode := ACipherMode;
        Init(Key);
        DecodeStream(EncryptStream, fsTrailer, EncryptStream.Size - EncryptStream.Position, nil);
      finally
        EncryptStream.Seek(0, soFromBeginning);
        fsTrailer.CopyFrom(EncryptStream, FileInfo.FFileSize);
        ProtectBinary(Salt);
        ProtectBinary(Key);
        EncryptStream.Free;
      end;
    finally
      fsTrailer.Free;
    end;
  finally
    fsCarrier.Free;
  end;
end;
Nur leider kommt dabei Schrott raus und die Datei ist auch ein paar Bytes größer als die original Datei.

Sieht da irgend jemand den Fehler, den ich mache?

Klaus01 5. Mär 2010 21:29

Re: DEC Stream Entschlüsselung schlägt fehl
 
Hallo Michael,

versuchst Du hier den Stream inclusive des Salts zu dekodieren?
Delphi-Quellcode:
  DecodeStream(EncryptStream, fsTrailer, EncryptStream.Size - EncryptStream.Position, nil);
Sollte der Salt nicht aus dem Strean entfernt werden bevor der Stream dekodiert wird?

Grüße
Klaus

Luckie 5. Mär 2010 21:31

Re: DEC Stream Entschlüsselung schlägt fehl
 
Ich lese ihn ja aus:
Delphi-Quellcode:
EncryptStream.Read(Salt[1], Length(Salt));
Da nach müsste der Positionszeiger doch hinter dem Salt stehen oder irre ich mich da?

Aber ich überlege gerade in TfileInfo.FFileSize steht noch der Salt mit drin.

Luckie 5. Mär 2010 21:50

Re: DEC Stream Entschlüsselung schlägt fehl
 
Neue Erkenntnisse. jetzt stimmt zumindest wieder die Dateigröße:
Delphi-Quellcode:
procedure TAppendFile.ExtractEncrypted;
var
  fsCarrier: TFileStream;
  fsTrailer: TFileStream;
  EncryptStream: TMemoryStream;
  Salt: Binary;
  Key: Binary;
begin
  ReadFileInfo;
  fsCarrier := TFileStream.Create(FCarrierFile, fmOpenRead);
  try
    fsCarrier.Seek(-SizeOf(TFileInfo) - FileInfo.FFileSize, soFromEnd);
    fsTrailer := TFileStream.Create(DestFolder + FileInfo.FFilename, fmCreate);
    try
      EncryptStream := TMemoryStream.Create;
      with ValidCipher(ACipherClass).Create, Context do
      try
        EncryptStream.CopyFrom(fsCarrier, FileInfo.FFileSize);
        EncryptStream.Seek(0, soFromBeginning);
        SetLength(Salt, 16);
        EncryptStream.Read(Salt[1], Length(Salt));
        Key := ValidHash(AHashClass).KDFx(FPassword, Salt, KeySize, TFormat_Copy, AKDFIndex);
        Mode := ACipherMode;
        Init(Key);
        DecodeStream(EncryptStream, fsTrailer, EncryptStream.Size - Length(Salt), nil);
      finally
        ProtectBinary(Salt);
        ProtectBinary(Key);
        EncryptStream.Free;
      end;
    finally
      fsTrailer.Free;
    end;
  finally
    fsCarrier.Free;
  end;
end;
Allerdings die Entschlüsselung ist immer noch falsch.

Luckie 5. Mär 2010 22:21

Re: DEC Stream Entschlüsselung schlägt fehl
 
OK, Ich weiß nicht, was es war, aber jetzt scheint es zu funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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