![]() |
Schnellere XOR Operation
Einen schönen Abend!
Ich nutze die folgende Funktion, um 1 Datei mit einem Teil der 2. Datei zu "verschlüsseln", wobei dies nur eine simple XOR-Verschlüsselung ist:
Delphi-Quellcode:
Wenn ich diese Funktion in mein Programm integriere, läuft sie gut. Das jedoch nur bei "kleinen" Schlüsseldateien. Will ich eine größere Datei verwenden, braucht das Programm ewig. Dabei lässt sich auch das GUI kaum mehr nutzen, bzw. stürzt völlig ab. Kann ich was dagegen tun? Oder gibt es vielleicht eine "echte" Verschlüsselungsmethode, die schnell genug ist? Die zu ver- und entschlüsselnden Dateien sollten beliebig groß sein können.
procedure Crypt(XFile, KFile: String); //Durch die freundliche Unterstützung von rollstuhlfahrer und Uwe Raabe entstanden
var fkey, fxfile: TFilestream; keys: array[0..524287] of Char; // deine Menge weniger 1 i: Cardinal; buffer: Char; 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 := Chr(Ord(buffer) XOR Ord(keys[(i-1) mod 524287])); fxFile.Write(buffer, 1); // XOR end; fxfile.Free; end; Danke im Voraus :dp: |
Re: Schnellere XOR Operation
Du liest immer nur ein Zeichen ein. Mach das mal mit einem Puffer (z.B. 8k). Dann geht das auch schneller.
|
Re: Schnellere XOR Operation
Könntest du mir denn vielleicht sagen, was ich unter Puffer verstehen soll? Bitte nicht auf die Suchfunktion verlinken, hab schon hier, auf delphi-treff und in der Delphi-Hilfe gesucht...
Meinst du damit, die Datei mit einem Stream zu durchlaufen oder versteh ich das falsch? Bitte um Code-Beispiele oder irgendwelche Stichwörter. Danke. |
Re: Schnellere XOR Operation
Hi,
Ich würds so machen: Lad (wenn die Datei nicht soooooooo groß ist) die komplette Datei in den Speicher, Xore sie und schreib dann die ganze gexorte Datei wieder zurück. |
Re: Schnellere XOR Operation
Ein kleines Beispiel:
Delphi-Quellcode:
(Bin mir nicht sicher, ,ob das kompiliert, aber so könnte eine Pufferung aussehen. In diesem Fall wird die ganze Datei geladen. Das geht solange gut, wie die Datei wesentlich kleiner als der RAM ist.)
procedure ReplaceFile(FileName: String)
var fs: TFileStream; mem: TmemoryStream; i: Integer; begin mem := TMemoryStream.Create(); fs := TFileStream.Create(FileName, fmOpenReadWrite or fmShareExclusive); try mem.CopyFrom(fs, 0); // Mach etwas mit memstream fs.CopyFrom(mem, 0); finally fs.Free; mem.Free; end; end; |
Re: Schnellere XOR Operation
tja, und dann gäbe es auch noch die uralt-Befehle BlockRead() und BlockWrite() - die Delphi-Hilfe zeigt da ein schönes Beispiel. Den Puffer kann man in der Größe flexibel gestalten und zwischen dem BlockRead() und dem BlockWrite() liesse sich das XORen sehr schön placieren :wink:
|
Re: Schnellere XOR Operation
Ein Puffer ist ein Datenbereich im Speicher, mit dem man schnell(er) arbeiten kann. Die Methode 'TFileStream.Read' liest ja nicht nur ein Zeichen, sondern kann auch mehrere Zeichen einlesen. Die Methode liefert außerdem die Anzahl der gelesenen Zeichen. Sobald dieser Wert < als der zu lesende Wert ist, ist die Datei am Ende.
Die Methode 'TFileStream.Write' schreibt den (veränderten) Puffer dann wieder in eine Datei. Zitat:
![]() |
Re: Schnellere XOR Operation
Ist schon 2 Monate her, aber ich hatte keine Zeit, mich mit Delphi zu beschäftigen, aber nun bin ich wieder da.
Ich bin euren Ratschlägen gefolgt und habe den Puffer vergrößert und alles mühevoll angepasst.
Delphi-Quellcode:
Nun ist eigentlich alles genauso, wie ich es will. Nur ein paar Sachen klappen nicht.
procedure Crypt(XFile, KFile, NewFile: String);
var fkey, fxfile: TFilestream; : TFilestream; keys: array[0..524287] of Byte; // deine Menge weniger 1 i, calc: Cardinal; buffer: Byte; realbuffer: LongInt; begin fkey := TFileStream.Create(KFile, fmOpenRead); fkey.Read(keys, 524288); // nun wieder vollzählig fkey.Free; // wird nicht mehr benötigt, da im Speicher CopyFile(PChar(OriginalFile), PChar(NewFile), FALSE); fxfile := TFileStream.Create(NewFile, fmOpenReadWrite); SaveProgress.MaxValue := fxfile.Size; SaveProgress.Progress := SaveProgress.MinValue; calc := fxfile.Size div 2048; for i := 0 to calc do begin realbuffer := fxfile.Read(buffer, 2048); fxfile.Position := fxfile.Position - realbuffer; buffer := buffer XOR keys[(i mod 524287)]; // XOR fxfile.Write(buffer, realbuffer); SaveProgress.Progress := SaveProgress.Progress + realbuffer; SaveProgress.Refresh; //Progressbar aktualisieren Application.processmessages; //Fenster noch verwendbar end; fxfile.Free; ShowMessage(Name1.Text + ' was mixed with ' + Name2.text); end;
Zur Puffergröße: Wovon hängt die erlaubte Puffergröße ab? Ich hab es mit >2KB versucht, doch dann passiert, dass die Progressbar nichts anzeigt, dann sofort die Meldung angezeigt wird, keine AV, aber beim 2.ten Aufrufen der Prozedur gibt's eine AV: Zitat:
Die AV zum 2ten Problem: Zitat:
|
Re: Schnellere XOR Operation
Zitat:
|
Re: Schnellere XOR Operation
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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