Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
DEC Stream Entschlüsselung schlägt fehl
5. Mär 2010, 22:03
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?
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|