![]() |
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:
Das funktioniert auch.
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; Folgende Methode soll dann den Stream wieder aus der Datei lesen und entschlüsseln:
Delphi-Quellcode:
Nur leider kommt dabei Schrott raus und die Datei ist auch ein paar Bytes größer als die original Datei.
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; Sieht da irgend jemand den Fehler, den ich mache? |
Re: DEC Stream Entschlüsselung schlägt fehl
Hallo Michael,
versuchst Du hier den Stream inclusive des Salts zu dekodieren?
Delphi-Quellcode:
Sollte der Salt nicht aus dem Strean entfernt werden bevor der Stream dekodiert wird?
DecodeStream(EncryptStream, fsTrailer, EncryptStream.Size - EncryptStream.Position, nil);
Grüße Klaus |
Re: DEC Stream Entschlüsselung schlägt fehl
Ich lese ihn ja aus:
Delphi-Quellcode:
Da nach müsste der Positionszeiger doch hinter dem Salt stehen oder irre ich mich da?
EncryptStream.Read(Salt[1], Length(Salt));
Aber ich überlege gerade in TfileInfo.FFileSize steht noch der Salt mit drin. |
Re: DEC Stream Entschlüsselung schlägt fehl
Neue Erkenntnisse. jetzt stimmt zumindest wieder die Dateigröße:
Delphi-Quellcode:
Allerdings die Entschlüsselung ist immer noch falsch.
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; |
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 13:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz