// Es wird mit
einfachen Mitteln eine Verschlüsselung von Dateien erreicht. const schluessel: string = 'ab#123@x-*oY2'; // oder sonstwas
procedure verschlFile(datei, schl: string);
var b: byte;
x: longint;
i, lg: integer;
m, f: TMemoryStream;
begin
screen.cursor := crHourglass;
i := 1;
lg := length(schl);
m := Tmemorystream.create;
f := Tmemorystream.create;
try
f.loadfromfile(datei);
for x := 0 to f.size - 1 do begin
f.readbuffer(b, 1);
b := b xor ord(schl[i]);
m.writebuffer(b, 1);
inc(i);
if i > lg then i := 1;
end;
f.free;
m.savetofile(datei);
finally
try
f.free;
except end;
m.free;
screen.cursor := crdefault;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
verschlFile('c:\meineDatei.txt', schluessel);
end;
//--------------------------------------------------------------------- function verschl(Datei, schl: string {;gd:TGauge}): boolean;
const bufgr = word(1024);
var quelle, ziel: file;
anzahl, geschrieben, x, i, lg: integer;
temp: string;
flag: boolean;
buf: array[0..bufgr - 1] of byte;
begin
flag := true;
i := 1;
lg := length(schl);
setlength(temp, max_path);
setlength(temp, GetTempPath(max_path, pchar(temp)));
temp := temp + '~TmpVerschl.~~~';
assignfile(quelle, Datei);
assignfile(ziel, temp);
{$I-}
reset(quelle, 1);
if ioresult = 0 then begin
rewrite(ziel, 1);
if ioresult = 0 then begin
//gd.maxvalue:=filesize(quelle);
repeat
BlockRead(quelle, Buf, bufgr, anzahl);
if ioresult <> 0 then begin flag := false;
break;
end;
for x := 0 to anzahl - 1 do begin
buf[x] := buf[x] xor ord(schl[i]);
inc(i);
if i > lg then i := 1;
end;
BlockWrite(ziel, Buf, anzahl, geschrieben);
if ioresult <> 0 then begin flag := false;
break;
end;
//gd.progress:=gd.progress + geschrieben;
until (anzahl = 0) or (geschrieben <> anzahl);
closefile(ziel);
end else flag := false;
closefile(quelle);
end else flag := false;
{$I+}
if flag then begin
try
deletefile(Datei);
movefile(pchar(temp), pchar(datei));
except flag := false;
end;
end;
result := flag;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//gauge1.visible:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
var schluessel, dateiname: string;
begin
dateiname := 'c:\test.txt';
schluessel := '#@a3-ä*A7';
//gauge1.progress:=0;
//gauge1.visible:=true;
if not verschl(dateiname, schluessel {,gauge1})
then showmessage('Fehler ' + inttostr(getlasterror));
//gauge1.visible:=false;
end;
function
verschl(unverschlsslt, verschlsslt, privatschl, standardschl: string):
boolean;
const
relevant = 10;
bufgr = word(2048);
var quelle, ziel: file;
anzahl, geschrieben, x, i, ii, lg, grsse: integer;
flag: boolean;
buf: array[0..bufgr - 1] of char;
prvt: string;
st: TFileStream;
function privatErzeugen(schluessel: string): string;
var
y, p, n: Integer;
begin
result := '';
p := 0;
for y := 1 to length(schluessel) do begin
inc(p);
if p > length(schluessel) then p := 1;
n := random(100) + 1 + ord(schluessel[p]);
result := result + formatfloat('000', n);
end;
end;
begin
if fileexists(privatschl) then deletefile(privatschl);
if unverschlsslt <> verschlsslt then begin
setlength(prvt, relevant);
flag := true;
lg := length(standardschl);
assignfile(quelle, unverschlsslt);
assignfile(ziel, verschlsslt);
{$I-}
reset(quelle, 1);
if ioresult = 0 then begin
grsse := filesize(quelle);
if grsse >= relevant * 3 then begin
BlockRead(quelle, prvt[1], relevant, anzahl);
if (ioresult = 0) and (anzahl = relevant) then begin
prvt := privatErzeugen(prvt);
seek(quelle, 0);
rewrite(ziel, 1);
if ioresult = 0 then begin
repeat
BlockRead(quelle, Buf, bufgr, anzahl);
if ioresult <> 0 then begin flag := false;
break;
end;
i := 1;
ii := relevant * 3;
for x := 0 to anzahl - 1 do begin
buf[x] := chr(byte(buf[x]) xor ord(standardschl[i]) xor
ord(prvt[ii]));
inc(i);
if i > lg then i := 1;
inc(ii);
if ii > relevant * 3 then ii := 1;
end;
BlockWrite(ziel, Buf, anzahl, geschrieben);
if ioresult <> 0 then begin flag := false;
break;
end;
until (anzahl = 0) or (geschrieben <> anzahl);
closefile(ziel);
end else flag := false;
closefile(quelle);
end else flag := false;
end else flag := false;
end else flag := false;
{$I+}
end else flag := false;
result := flag;
if result then begin
st := TFilestream.create(privatschl, fmcreate);
st.writebuffer(prvt[1], relevant * 3);
st.free;
end;
end;
// Beispielaufruf zum Verschlüsseln
procedure TForm1.Button3Click(Sender: TObject);
const
zuverschluesseln = 'c:\test.txt';
verschluesselt = 'c:\test.dbr';
schluesselspeicher = 'c:\privatschl.txt';
standardschluessel = '0+?ß#-ä*Qe$%.<';
begin
if not verschl(zuverschluesseln, verschluesselt,
schluesselspeicher, standardschluessel)
then showmessage('FEHLER');
end;
// Und so wird dann entschlüsselt
function
entschl(verschlsslt, unverschlsslt, standard, privat: string): boolean;
const bufgr = word(2048);
var quelle, ziel: file;
anzahl, geschrieben, x, i, ii, lg, lg2: integer;
flag: boolean;
buf: array[0..bufgr - 1] of char;
begin
flag := true;
lg := length(standard);
lg2 := length(privat);
assignfile(quelle, verschlsslt);
assignfile(ziel, unverschlsslt);
{$I-}
reset(quelle, 1);
if ioresult = 0 then begin
rewrite(ziel, 1);
if ioresult = 0 then begin
repeat
BlockRead(quelle, Buf, bufgr, anzahl);
if ioresult <> 0 then begin flag := false;
break;
end;
i := 1;
ii := lg2;
for x := 0 to anzahl - 1 do begin
buf[x] := chr(byte(buf[x]) xor ord(standard[i]) xor
ord(privat[ii]));
inc(i);
if i > lg then i := 1;
inc(ii);
if ii > lg2 then ii := 1;
end;
BlockWrite(ziel, Buf, anzahl, geschrieben);
if ioresult <> 0 then begin flag := false;
break;
end;
until (anzahl = 0) or (geschrieben <> anzahl);
closefile(ziel);
end else flag := false;
closefile(quelle);
end else flag := false;
{$I+}
result := flag;
end;
// Beispielaufruf zur Entschlüsselung.
// Es wird davon ausgegangen, dass der private Schlüssel
// in der Datei "c:\privatschl.txt" steht und dass der
// Standardschlüssel der gleiche ist, wie beim Verschlüsseln.
procedure TForm1.Button4Click(Sender: TObject);
const
verschluesselt = 'c:\test.dbr';
zuentschluesseln = 'c:\test.txt';
schluesselspeicher = 'c:\privatschl.txt';
standardschluessel = '0+?ß#-ä*Qe$%.<';
var
privatschluessel: string;
st: TFilestream;
begin
st := TFilestream.create(schluesselspeicher, fmopenread);
setlength(privatschluessel, st.size);
st.readbuffer(privatschluessel[1], st.size);
st.free;
if not
entschl(verschluesselt, zuentschluesseln, standardschluessel,
privatschluessel)
then showmessage('FEHLER');
end;
var
ba: array[0..255] of word;
procedure maketable(seed: longint);
var
w: word;
x, y: integer;
b: array[0..1] of byte;
function zuweisen: boolean;
var
i: integer;
begin
result := false;
for i := 0 to 255 do begin
if ba[i] = w then exit else
if ba[i] = 0 then begin
ba[i] := w;
result := true;
exit;
end;
end;
end;
begin
randseed := seed;
zeromemory(@ba, sizeof(ba));
for x := 0 to 255 do begin
repeat;
for y := 0 to 1 do
b[y] := random(26) + 65;
w := b[0] or (b[1] shl 8);
until zuweisen;
end;
end;
function encrypt(von, nach: TFilename; g: TGauge): boolean;
var
p: PByte;
x: integer;
w, m: word;
quelle, ziel: TMemoryStream;
begin
result := false;
quelle := TMemoryStream.create;
ziel := TMemoryStream.create;
try
quelle.loadfromfile(von);
p := quelle.memory;
g.maxvalue := pred(quelle.size);
maketable(g.maxvalue);
randomize;
for x := 0 to g.maxvalue do begin
w := ba[ord(p^)];
if (w = m) then
case random(3) of
0: w := (hi(w) shl 8) or (lo(w) - 32);
1: w := lo(w) or ((hi(w) + 36) shl 8);
else w := lo(w) or ((hi(w) - 32) shl 8);
end;
m := w;
ziel.writebuffer(w, 2);
g.progress := x;
inc(p);
application.processmessages;
end;
ziel.savetofile(nach);
result := true;
except
end;
ziel.free;
quelle.free;
g.progress := 0;
end;
function decrypt(von, nach: TFilename; g: TGauge): boolean;
var
quelle, ziel: TMemoryStream;
p: PByte;
x: integer;
b, c: byte;
function lesen: byte;
begin
result := p^;
if result < 65 then inc(result, 32) else
if result > 90 then dec(result, 36);
inc(p);
end;
function finden(w: word): byte;
var
i: integer;
begin
for i := 0 to 255 do
if ba[i] = w then begin
result := i;
break;
end;
end;
begin
result := false;
quelle := TMemoryStream.create;
ziel := TMemoryStream.create;
try
quelle.loadfromfile(von);
p := quelle.memory;
g.maxvalue := pred(quelle.size div 2);
maketable(g.maxvalue);
for x := 0 to g.maxvalue do begin
b := lesen;
c := lesen;
b := finden(b or (c shl 8));
ziel.writebuffer(b, 1);
g.progress := x;
application.processmessages;
end;
ziel.savetofile(nach);
result := true;
except
end;
ziel.free;
quelle.free;
g.progress := 0;
end;
// Verschlüsseln
procedure TForm1.Button3Click(Sender: TObject);
begin
TButton(sender).enabled := false;
if not
encrypt('c:\clapton.bmp', 'c:\verschlüsselt.txt', Gauge1)
then showmessage('FEHLER')
else showmessage('OK');
TButton(sender).enabled := true;
end;
// entschlüsseln
procedure TForm1.Button8Click(Sender: TObject);
begin
TButton(sender).enabled := false;
if not
decrypt('c:\verschlüsselt.txt', 'c:\entschlüsselt.bmp', Gauge1)
then showmessage('FEHLER')
else showmessage('OK');
TButton(sender).enabled := true;
end;
var
passwort: string = 'DBR 4. Dezember 2005'; // beispielsweise
ba: array[0..63] of char;
procedure maketable(const schlssl: string);
var
x, b: byte;
function seed: string;
var
i, z, erg: integer;
begin
erg := 0;
result := '';
for z := 2 to 10 do begin
for i := 1 to length(schlssl) do
erg := (erg * 2 + ord(schlssl[i]) * (z - ord(odd(i)) * pred(z))) mod 97;
result := result + inttostr(erg mod 9);
end;
end;
function zuweisen: boolean;
var
i: integer;
begin
result := false;
for i := 0 to 63 do begin
if ba[i] = chr(b) then exit else
if ba[i] = #0 then begin
ba[i] := chr(b);
result := true;
exit;
end;
end;
end;
begin
randseed := strtoint(seed);
zeromemory(@ba, sizeof(ba));
for x := 0 to 63 do
repeat;
b := random(95) + 32;
until zuweisen;
end;
function encrypt(von, nach: TFilename; g: TGauge): boolean;
var
p: PChar;
r: string;
x, gr: integer;
quelle, ziel: TMemoryStream;
begin
result := false;
if passwort = '' then exit;
quelle := TMemoryStream.create;
ziel := TMemoryStream.create;
try
ziel.loadfromfile(von);
gr := ziel.size;
ziel.seek(0, 0);
quelle.writebuffer(gr, 4);
quelle.copyfrom(ziel, gr);
except
ziel.free;
quelle.free;
exit;
end;
ziel.size := 0;
try
maketable(passwort);
r := #0#0;
quelle.seek(0, sofromend);
quelle.writebuffer(r[1], 2);
g.maxvalue := pred(quelle.size);
p := quelle.memory;
randomize;
x := 0;
while x < quelle.size do begin
r := ba[ord((p + x)^) shr 2] + ba[(ord((p + x)^) and 3) shl 4
or ord((p + 1 + x)^) shr 4]
+ ba[(ord((p + 1 + x)^) and 15) shl 2 or ord((p + 2 + x)^) shr 6]
+ ba[ord((p + 2 + x)^) and 63];
ziel.writebuffer(r[1], 4);
g.progress := x;
inc(x, 3);
application.processmessages;
end;
ziel.savetofile(nach);
result := true;
except
end;
ziel.free;
quelle.free;
g.progress := 0;
end;
function decrypt(von, nach: TFilename; g: TGauge): boolean;
var
p: PChar;
b: byte;
a: array of byte;
x, i, gr: integer;
quelle, ziel: TMemoryStream;
begin
result := false;
if passwort = '' then exit;
quelle := TMemoryStream.create;
try
quelle.loadfromfile(von);
p := quelle.memory;
i := quelle.size;
g.maxvalue := i * 2;
maketable(passwort);
setlength(a, i);
for x := 0 to pred(i) do begin
a[x] := pred(pos((p + x)^, ba));
g.progress := x;
application.processmessages;
end;
except;
g.progress := 0;
quelle.free;
a := nil;
exit;
end;
quelle.size := 0;
ziel := TMemoryStream.create;
try
x := 0;
while x < i do begin
b := (a[x] shl 2) or (a[x + 1] shr 4);
quelle.writebuffer(b, 1);
b := (a[x + 1] shl 4) or (a[x + 2] shr 2);
quelle.writebuffer(b, 1);
b := ((a[x + 2] and 3) shl 6) or (a[x + 3] and 63);
quelle.writebuffer(b, 1);
inc(x, 4);
g.progress := x + i;
application.processmessages;
end;
quelle.seek(0, 0);
quelle.readbuffer(gr, 4);
ziel.copyfrom(quelle, gr);
ziel.savetofile(nach);
result := true;
except
end;
a := nil;
ziel.free;
quelle.free;
g.progress := 0;
end;
// Beispielaufrufe
// Verschlüsseln
procedure TForm1.Button3Click(Sender: TObject);
begin
TButton(sender).enabled := false;
if not
encrypt('c:\test.bmp', 'c:\verschlüsselt.txt', Gauge1)
then showmessage('FEHLER')
else showmessage('OK');
TButton(sender).enabled := true;
end;
// entschlüsseln
procedure TForm1.Button8Click(Sender: TObject);
begin
TButton(sender).enabled := false;
if not
decrypt('c:\verschlüsselt.txt', 'c:\entschlüsselt.bmp', Gauge1)
then showmessage('FEHLER')
else showmessage('OK');
TButton(sender).enabled := true;
end;
|





