Thema: Delphi Fragen zu TFileStream

Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.483 Beiträge
 
Delphi 12 Athens
 
#7

Re: Fragen zu TFileStream

  Alt 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
  Mit Zitat antworten Zitat