Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.483 Beiträge
Delphi 12 Athens
|
Re: Fragen zu TFileStream
13. Okt 2008, 18:29
So sollte es gehen (übrigens auch mit Delphi 2009):
Delphi-Quellcode:
procedure EncryptFile(XFile, KFile: String);
var
fkey, fxfile: TFilestream;
keys: array[0..524287] of Byte; // deine Menge weniger 1
i: Cardinal;
buffer: Byte;
begin
fkey := TFileStream.Create(kfile, fmOpenRead);
fkey.Read(keys, 524288); // nun wieder vollzählig
fkey.Free; // wird nicht mehr benötigt, da im Speicher
fxfile := TFileStream.Create(xFile, fmOpenReadWrite);
for i := 0 to fxfile.Size-1 do
begin
fxfile.Read(buffer, 1);
fxfile.Position := fxFile.Position - 1;
buffer := buffer XOR keys[i mod 524287];
fxFile.Write(buffer, 1); // XOR
end;
fxfile.Free;
end;
Wesentlich performanter und mit unterschiedlichen Schlüsseldateilängen geht das aber so (funktioniert nur, wenn die zu verschlüsselnde Datei komplett in den Speicher geht!):
Delphi-Quellcode:
procedure EncryptFile(const XFile, KFile: String);
var
fileStream: TFilestream;
memStream: TMemoryStream;
keys: array of Byte;
keySize: Cardinal;
i: Cardinal;
buffer: Byte;
begin
{ Schlüsseldatei in Byte-Array einlesen }
fileStream := TFileStream.Create(kfile, fmOpenRead);
try
keySize := fileStream.Size;
SetLength(keys, keySize);
fileStream.Read(keys, keySize);
finally
fileStream.Free;
end;
memStream := TMemoryStream.Create;
try
{ xFile Datei in MemoryStream kopieren }
fileStream := TFileStream.Create(xFile, fmOpenRead);
try
memStream.CopyFrom(fileStream, fileStream.Size);
memStream.Position := 0; // wieder auf Start setzen
finally
fileStream.Free;
end;
fileStream := TFileStream.Create(xFile, fmOpenWrite);
try
for i := 0 to memStream.Size - 1 do
begin
memStream.Read(buffer, 1);
buffer := buffer XOR keys[i mod keySize]; // XOR
fileStream.Write(buffer, 1);
end;
finally
fileStream.Free;
end;
finally
memStream.Free;
end;
end;
Uwe Raabe
|
|
Zitat
|