// Mit diesem Code
kann man große Dateien verhältnismäßig schnell unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Gauges; type art = (encrypt, decrypt); TForm1 = class(TForm) OpenDialog1: TOpenDialog; Button1: TButton; Button2: TButton; Gauge1: TGauge; Button3: TButton; Button4: TButton; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public function work(const Datei, Key: string; was: art; gauge: TGauge; prf: boolean): byte; procedure Crypt(const Key: string; was: art; berechtigung: boolean = true); end; var Form1: TForm1; implementation {$R *.DFM} var stopp: boolean; procedure TForm1.FormCreate(Sender: TObject); begin Gauge1.progress := 0; end; function hash(const s: string): string; var x, z, i, erg: integer; begin erg := 1; result := ''; for z := 2 to 11 do begin for x := 1 to length(s) do erg := (erg * 2 + ord(s[x]) * (z - ord(odd(x)) * (z - 1))) mod 97; i := erg mod 10; if (i = 0) or (i = 8) then inc(i); result := result + chr(i); end; end; function TForm1.work(const Datei, Key: string; was: art; gauge: TGauge; prf: boolean): byte; var grss, x, buf, anz, hlp, u: Cardinal; s, h, v, b, kennung, usr: string; quelle, ziel: TMemoryStream; schlssl: array of byte; k, lg, lk, i: integer; bq, bz: boolean; p: pchar; procedure ende; begin if bq then quelle.free; if bz then ziel.free; schlssl := nil; screen.cursor := crdefault; end; begin if not fileexists(Datei) then begin result := 1; exit; end; lg := length(key); if (lg < 3) or (lg > 255) then begin result := 2; exit; end; screen.cursor := crhourglass; lk := 10; u := max_path; getmem(p, u); getusername(p, u); usr := p; freemem(p); try k := 0; for x := 1 to lg do k := k + ord(key[x]); randseed := k shl 1; lg := 500; setlength(schlssl, lg); for x := 0 to pred(lg) do schlssl[x] := random(224) + 32; bz := false; bq := bz; hlp := random(654321) or 123456789; setlength(b, lk); setlength(kennung, lk); for x := 1 to 10 do begin kennung[x] := chr(random(32) + 9); b[x] := chr(random(222) + 9); end; try quelle := TMemoryStream.create; bq := true; except result := 3; ende; exit; end; try quelle.loadfromfile(datei); grss := quelle.size; if grss = 0 then begin result := 4; ende; exit; end; gauge.maxvalue := 4 + grss div 4; except result := 5; ende; exit; end; try ziel := TMemorystream.create; bz := true; ziel.setsize(grss); ziel.position := 0; except result := 6; ende; exit; end; try quelle.position := 0; i := 0; if prf or (was = decrypt) then h := hash(usr) else h := b; if was = encrypt then begin ziel.WriteBuffer(kennung[1], lk); ziel.writebuffer(h[1], lk); ziel.WriteBuffer(grss, 4); end else begin setlength(s, lk); setlength(v, lk); quelle.Read(s[1], lk); quelle.Read(v[1], lk); quelle.Read(grss, 4); if s <> kennung then begin result := 7; ende; exit; end; if (h <> v) and (v <> b) then begin result := 8; ende; exit; end; end; for x := 0 to grss div 4 do begin anz := quelle.read(buf, 4); buf := buf xor (schlssl[i] or hlp); ziel.write(buf, anz); application.processmessages; if stopp or application.terminated then begin result := 9; ende; exit; end; inc(i); if i = lg then i := 0; gauge.progress := succ(gauge.progress); end; if was = decrypt then ziel.setsize(grss); except result := 10; ende; exit; end; try quelle.free; bq := false; ziel.savetofile(datei); // Ausgangsdatei wird überschrieben gauge.progress := gauge.MaxValue; gauge.refresh; sleep(200); except result := 11; ende; exit; end; result := 0; except result := 255; end; ende; end; procedure TForm1.Crypt(const Key: string; was: art; berechtigung: boolean = true); var Meldung, s: string; begin if OpenDialog1.execute then begin stopp := false; if was = encrypt then s := 'Ver' else s := 'Ent'; case work(OpenDialog1.Filename, key, was, Gauge1, berechtigung) of 0: Meldung := 'Erfolgreich beendet'; 1: Meldung := 'Datei nicht gefunden'; 2: Meldung := 'Passwort muss eine Länge von 3 bis 255 Zeichen haben'; 3: Meldung := 'Quellstream wurde nicht erstellt'; 4: Meldung := 'Leere Dateien können nicht bearbeitet werden'; 5: Meldung := 'Datei konnte nicht geladen werden'; 6: Meldung := 'Fehler beim Erstellen des Zielstreams'; 7: Meldung := 'Datei kann nicht entschlüsselt werden'; 8: Meldung := 'Sie sind nicht berechtigt diese Datei zu entschlüsseln'; 9: Meldung := 'Abbruch durch den Benutzer'; 10: Meldung := 'Fehler beim ' + s + 'schlüsseln aufgetreten'; 11: Meldung := 'Abspeichern fehlgeschlagen'; else Meldung := 'Unerwarteter Fehler'; end; if not application.terminated then begin Gauge1.progress := 0; showmessage(Meldung); end; end; end; // ---------- Beispielaufrufe ---------- // Verschlüsseln mit User-Berechtigung. // Nur Sie selbst dürfen entschlüsseln. procedure TForm1.Button1Click(Sender: TObject); begin crypt('MeinPasswort', encrypt); end; // Verschlüsseln ohne User-Berechtigung. // Jeder, der das Passwort kennt, darf entschlüsseln. procedure TForm1.Button2Click(Sender: TObject); begin crypt('MeinPasswort', encrypt, false); end; // Entschlüsseln procedure TForm1.Button3Click(Sender: TObject); begin crypt('MeinPasswort', decrypt); end; // Vorgang (bei sehr großen Dateien) abbrechen procedure TForm1.Button4Click(Sender: TObject); begin stopp := true; end; end. |
Zugriffe seit 6.9.2001 auf Delphi-Ecke