|
// Es wird mit
einfachen Mitteln eine Verschlüsselung von Strings erreicht. //
1. String mit Hilfe von Random unter Vermeidung von #0 verschlüsseln type
Rnd = 0 .. $7000;
var
Value: Rnd = 14336; // z.B.
procedure coincidence(PW: string);
var
x, z, v, i: integer;
begin
i := 0;
v := 7;
for z := 2 to 11 do
begin
for x := 1 to length(PW) do
v := (v * 2 + ord(PW[x]) * z) mod 73;
i := i + v mod 10;
end;
randseed := 17 + i;
end;
function Crypt(const S, Key: WideString; EnCrypt: Boolean): WideString;
var
i: integer;
w, v: Word;
procedure makew;
begin
v := (v + random(99)) and MaxWord;
w := w xor random(v);
end;
procedure en;
begin
makew;
if w = 0 then
w := $FFFC;
end;
procedure de;
begin
if w = $FFFC then
w := 0;
makew;
end;
begin
Setlength(Result, length(S));
v := Value + $6789;
coincidence(Key);
for i := 1 to length(S) do
begin
w := ord(S[i]);
if EnCrypt then
en
else
de;
Result[i] := WideChar(w);
end;
end;
// Beispiel Verschlüsselung Memo1 --> Memo2
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo2.text := Crypt(Memo1.text, 'password', True);
end;
// Beispiel Entschlüsseln Memo2 selbst
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.text := Crypt(Memo2.text, 'password', False);
end;
//---------------------------------------------------------------------
// 1.1
Text mittels
Substitution verschlüsseln type
art = (Verschluesseln, Entschluesseln);
var
TestString: string = '';
function CryptTxt(txt, schlssl: string; like: art): string;
const
z = 31;
var
x, g: Integer;
pt, ps, pr: PChar;
begin
result := txt;
if txt = '' then
exit;
pt := @txt[1];
ps := @schlssl[1];
pr := @result[1];
for x := 1 to length(txt) do
begin
if like = Verschluesseln then
g := ord(pt^) + ord(ps^) - z
else
g := ord(pt^) - ord(ps^) + z;
pr^ := chr(g);
inc(pt);
inc(pr);
inc(ps);
if ps^ = #0 then
ps := @schlssl[1];
end;
end;
// Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.PlainText := True;
TestString := CryptTxt(RichEdit1.Text, 'DBR-Delphi', Verschluesseln);
RichEdit1.Text := TestString;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
RichEdit1.Text := CryptTxt(TestString, 'DBR-Delphi', Entschluesseln);
end;
//---------------------------------------------------------------------
1.2 Wesentliche Erweiterung von 1.1
// Getestet mit RS 10.4 unter W11
// Hierbei werden dem Ergebnis Prüfziffern vom Text und vom Passwort
// übergeben, wobei vorher das Passwort zusätzlich verschleiert wird.
// Durch Einbeziehung des Zufalls kann der verschlüsselte Text jedesmal
// anders aussehen. Außerdem wird durch den Wechsel zwischen RawByteString
// und String das Ergebnis völlig unleserlich.
type
C2 = array [0 .. 1] of Char;
sls = array [0 .. 19] of Byte;
Buch = array [0 .. 223] of Byte;
var
SB: Buch;
schls: sls;
procedure makeSB(rb: RawByteString; lg: Integer);
var
I: Integer;
function makeKey(rb: RawByteString; lg: Integer): sls;
var
I, X: Integer;
begin
X := 1;
for I := 0 to 19 do
begin
Result[I] := (SB[I] xor ord(rb[X])) and $F7;
inc(X);
if X > lg then
X := 1;
end;
end;
procedure Swap(n, M: Byte);
var
tmp: Byte;
begin
tmp := SB[n];
SB[n] := SB[M];
SB[M] := tmp;
end;
begin
for I := Low(SB) to High(SB) do
SB[I] := I + 32;
for I := High(SB) downto 0 do
Swap(I, random(I));
schls := makeKey(rb, lg);
end;
function hash(const s: string): C2;
var
X, z, erg, lg: Integer;
a: ansistring;
P: PChar;
begin
a := '';
erg := 1;
lg := length(s);
for z := 2 to 5 do
begin
for X := 1 to lg do
erg := (erg * 2 + ord(s[X]) * (z - ord(odd(X)) * (z - 1))) mod 93;
a := a + AnsiChar(erg mod 10);
end;
P := @a[1];
Result[0] := P^;
inc(P);
Result[1] := P^;
end;
function CryptTxt(txt: RawByteString; lg: Integer; like: Boolean)
: RawByteString;
const
z = 31;
var
X, Y: Integer;
g: AnsiChar;
pt, pr: PAnsiChar;
begin
Result := txt;
pt := @txt[1];
pr := @Result[1];
Y := 0;
for X := 1 to lg do
begin
if like then
g := AnsiChar(ord(pt^) + schls[Y] - z)
else
g := AnsiChar(ord(pt^) - schls[Y] + z);
pr^ := g;
inc(pt);
inc(pr);
inc(Y);
if Y > 19 then
Y := 0;
end;
end;
function encode(const txt, Passw: String; out erg: String): Byte;
var
Start: Byte;
rb: RawByteString;
lt, I: Integer;
Pc: PChar;
C: C2;
HT: string;
begin
erg := '';
try
if txt = '' then
begin
Result := 1;
exit;
end;
lt := length(Passw);
if not(lt in [3 .. 10]) then
begin
Result := 2;
exit;
end;
C := hash(Passw);
HT := hash(txt);
Start := GettickCount and $FF;
RandSeed := Start;
lt := lt * 2;
SetLength(rb, lt);
CopyMemory(@rb[1], @Passw[1], lt);
makeSB(rb, lt);
lt := length(txt) * 2;
SetLength(rb, lt);
CopyMemory(@rb[1], @txt[1], lt);
rb := CryptTxt(rb, lt, True);
Pc := @rb[1];
I := 1;
while I < lt do
begin
erg := erg + Pc^;
inc(I, 2);
inc(Pc);
end;
erg := C[0] + Char(Start or $500) + erg + C[1];
erg := HT + hash(erg) + erg;
Result := 0;
except
Result := 255;
end;
end;
function decode(const txt, Passw: String; out erg: String): Byte;
var
s, HT: string;
Start: Byte;
rb: RawByteString;
lt, I: Integer;
Pc: PChar;
C: C2;
begin
erg := '';
try
lt := length(txt);
if lt < 4 then
begin
Result := 1;
exit;
end;
HT := copy(txt, 1, 2);
s := copy(txt, 3, maxint);
C[0] := s[1];
C[1] := s[2];
s := copy(s, 3, maxint);
if hash(s) <> C then
begin
Result := 2;
exit;
end;
lt := length(s);
C[0] := s[1];
C[1] := s[lt];
if C <> hash(Passw) then
begin
Result := 3;
exit;
end;
s := copy(s, 2, lt - 2);
Start := ord(s[1]) and $FF;
s := copy(s, 2, maxint);
RandSeed := Start;
lt := length(Passw) * 2;
SetLength(rb, lt);
CopyMemory(@rb[1], @Passw[1], lt);
makeSB(rb, lt);
lt := length(s) * 2;
SetLength(rb, lt);
CopyMemory(@rb[1], @s[1], lt);
rb := CryptTxt(rb, lt, False);
s := '';
Pc := @rb[1];
I := 1;
while I < lt do
begin
s := s + Pc^;
inc(I, 2);
inc(Pc);
end;
if HT <> hash(s) then
begin
Result := 4;
exit;
end;
erg := s;
Result := 0;
except
Result := 255;
end;
end;
// Beispielaufrufe:
// Memo1 verschlüsseln...
procedure TForm1.Button1Click(Sender: TObject);
var
Passwort, s, r: string;
b: Byte;
begin
// -------- Nur zum Testen -----------------------------------
Memo1.Clear;
Memo1.Lines.Add('Das ist ein Versuch: @¾¿ξ֎۞ᴪ₳ﮝ ÄÖÜßäöü ﴾ﷺ﴿');
Passwort := '¿ὠﻼ*12Ä';
// -----------------------------------------------------------
// Passwort := Edit1.Text;
b := encode(Memo1.Text, Passwort, s);
case b of
0:
begin
r := 'OK';
Memo1.Text := s;
end;
1:
r := 'Kein Text zum Verschlüsseln gefunden';
2:
r := 'Passwort muss 3 bis 10 Zeichen haben';
else
r := 'Unbekannter Fehler';
end;
ShowMessage(r);
end;
// ...und wieder entschlüsseln
procedure TForm1.Button2Click(Sender: TObject);
var
b: Byte;
r, s: string;
begin
b := decode(Memo1.Text, '¿ὠﻼ*12Ä', s);
case b of
0:
begin
Memo1.Text := s;
r := 'OK';
end;
1:
r := 'Kein ordnungsgemäßer Text zum Entschlüsseln gefunden';
2:
r := 'Dieser Text kann nicht entschlüsselt werden';
3:
r := 'Sie haben keine Berechtigung';
4:
r := 'Fehler bei der Entschlüsselung';
else
r := 'Unbekannter Fehler';
end;
ShowMessage(r);
end;
//--------------------------------------------------------------------- // 2.Text mittels Tabelle verschlüsseln // Getestet mit D4 unter Win98 und D2010 unter W7 // Eine simple Art der Verschlüsselung. Allerdings kann das Ergebnis über // die Häufigkeit der auftretenden Zeichen geknackt werden. Reicht aber allemal // aus, Text für andere Computer-User unleserlich zu machen. Die Zeichen in der // Tabelle müssen natürlich nicht in der Reihenfolge stehen wie im Beispiel. // Logischerweise braucht man für Ver- und Entschlüsselung die gleiche Tabelle. // Beim ersten Durchlauf wird verschlüsselt, beim nächsten wieder entschlüsselt. const
Tabelle = #10#32#13#9 +
'(+.%ßaÄäBbCcDdEeFfGgHhIiJjKkLlMmNnOoÖöPp=?-/;,!:*' +
'"_QqRrSsTtUuÜüVvWwXxYyZz0987654321A)';
function crypt(s: string): string;
var lg, ltab, stelle, such: integer;
begin
result := s;
lg := length(result);
if lg = 0 then exit;
ltab := length(Tabelle);
stelle := 1;
while stelle <= lg do begin
such := 1;
while (Tabelle[such] <> result[stelle]) and (such <= ltab) do inc(such);
if such <= ltab then result[stelle] := Tabelle[ltab - such + 1];
inc(stelle);
end;
end;
// Beispielaufruf procedure TForm1.Button3Click(Sender: TObject); begin Memo1.text := crypt(Memo1.text); end; //--------------------------------------------------------------------- const
Tab1 =
'4F2!"#N$%(S+/1,Ñ' +
'7Æ8:0;<M=>?@A«Cu' +
'KgTG9EH)I-L*OØQP' +
'UVèX[Ya£bcÙdehij';
Tab2 =
'tÞkÌnpÐqr¬yzÖÇÜs' +
'¤äf.×\]{D|Z}l~¡ü' +
'm¢J5¥¦§ö©ox®°B±µ' +
'»Wv¿6ÀÁÂRÄÈ3Òàwß';
V128: array[0..127] of char = Tab1 + Tab2;
function TabelleOK: byte;
const vbtn = [0..31, 38, 39, 127..159];
var i, j: integer;
begin
result := 1;
for i := 0 to 127 do
if ord(V128[i]) in vbtn {verbotene Zeichen}
then exit;
result := 2;
for i := 0 to 126 do
for j := i + 1 to 127 do
if V128[i] = V128[j] {doppelte Zeichen}
then exit;
result := 0;
end;
function encode(txt: string): string;
var
g: string;
i, lg, lt: integer;
function zufall: integer;
begin
result := random(2) * 64;
end;
begin
result := '';
if txt = '' then exit;
randomize;
lt := length(txt);
i := lt mod 3;
if i = 0 then g := '' else
g := stringofchar(#0, 3 - i);
lg := length(g);
txt := txt + g;
inc(lt, lg);
i := 1;
while i < lt do begin
result := result
+ V128[zufall + ord(txt[i]) shr 2]
+ V128[zufall + (ord(txt[i]) and 3) shl 4 or ord(txt[i + 1]) shr 4]
+ V128[zufall + (ord(txt[i + 1]) and 15) shl 2 or ord(txt[i + 2]) shr 6]
+ V128[zufall + ord(txt[i + 2]) and 63];
inc(i, 3);
end;
delete(result, 1 + length(result) - lg, lg);
end;
function decode(txt: string): string;
var
i, j, lt: integer;
a: array of byte;
begin
result := '';
i := 1;
while i <= length(txt) do begin
if (pos(txt[i], V128) = 0) then
delete(txt, i, 1) else inc(i);
end;
if txt = '' then exit;
lt := length(txt);
setlength(a, lt + 3);
for i := 1 to lt do begin
j := (pos(txt[i], V128) - 1);
a[i - 1] := j - ord(j > 63) * 64;
end;
i := 0;
while i < lt do begin
result := result
+ chr((a[i] shl 2) or (a[i + 1] shr 4))
+ chr((a[i + 1] shl 4) or (a[i + 2] shr 2))
+ chr(((a[i + 2] and 3) shl 6) or (a[i + 3] and 63));
inc(i, 4);
end;
a := nil;
end;
// ---Beispielaufrufe ---
// verschlüsseln
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.caption := '';
case TabelleOK of
1: showmessage('V128 enhält verbotene Zeichen');
2: showmessage('V128 enhält doppelte Zeichen');
else label1.caption := encode(Edit1.text);
end;
end;
// entschlüsseln
procedure TForm1.Button2Click(Sender: TObject);
begin
label2.ShowAccelChar := false; // falls "&" im entschlüsselten Text
label2.caption := decode(label1.caption);
end;
//--------------------------------------------------------------------- // 3a. Variante von 3 "V128" // Getestet mit RS 10.4 unter W11 // Der verschlüsselte Text wird wesentlich größer als das Original, // was aber das Knacken des Codes zusätzlich erschwert. Die Zeichen // in den Tabellen müssen vom Typ AnsiChar sein. const
Tab1 = '4F2!"#N$%(S+/1,Ñ7Æ8:0;<M=>?@A«CuKgTG9EH)I-L*OØQP' +
'UVèX[Ya£bcÙdehij';
Tab2 = 'tÞkÌnpÐqr¬yzÖÇÜs¤äf.×\]{D|Z}l~¡üm¢J5¥¦§ö©ox®°B±Á' +
'»Wv¿6ÀµÂRÄÈ3Òàwß';
V128: array [0 .. 127] of Ansichar = Tab1 + Tab2;
function TabelleOK: byte;
const
vbtn = [0 .. 31, 38, 39, 127 .. 159];
var
i, j: integer;
begin
result := 1;
for i := 0 to 127 do
if ord(V128[i]) in vbtn { verbotene Zeichen }
then
exit;
result := 2;
for i := 0 to 126 do
for j := i + 1 to 127 do
if V128[i] = V128[j] { doppelte Zeichen }
then
exit;
result := 0;
end;
function encode(s: string): string;
var
g: ansistring;
hlp, txt: Rawbytestring;
i, lg, lt: integer;
c: Ansichar;
P: Pansichar;
function zufall: integer;
begin
result := random(2) * 64;
end;
begin
result := '';
if s = '' then
exit;
txt := '';
P := @s[1];
for i := 1 to length(s) * 2 do
begin
txt := txt + P^;
inc(P);
end;
randomize;
c := #0;
lt := length(txt);
i := lt mod 3;
if i = 0 then
g := ''
else
g := stringofchar(c, 3 - i);
lg := length(g);
txt := txt + g;
inc(lt, lg);
i := 1;
while i < lt do
begin
hlp := hlp + V128[zufall + ord(txt[i]) shr 2] +
V128[zufall + (ord(txt[i]) and 3) shl 4 or ord(txt[i + 1]) shr 4] +
V128[zufall + (ord(txt[i + 1]) and 15) shl 2 or ord(txt[i + 2]) shr 6] +
V128[zufall + ord(txt[i + 2]) and 63];
inc(i, 3);
end;
delete(hlp, 1 + length(hlp) - lg, lg);
result := string(hlp);
end;
function decode(s: string): string;
var
i, j, lt: integer;
a: array of byte;
txt: Rawbytestring;
P: Pansichar;
pc: PChar;
begin
result := '';
if s = '' then
exit;
txt := '';
P := @s[1];
i := 1;
while i < length(s) * 2 do
begin
if odd(i) then
txt := txt + P^;
inc(P);
inc(i);
end;
lt := length(txt);
setlength(a, lt + 3);
for i := 1 to lt do
begin
j := (pos(txt[i], V128) - 1);
a[i - 1] := j - ord(j > 63) * 64;
end;
txt := '';
i := 0;
while i < lt do
begin
txt := txt + Ansichar((a[i] shl 2) or (a[i + 1] shr 4)) +
Ansichar((a[i + 1] shl 4) or (a[i + 2] shr 2)) +
Ansichar(((a[i + 2] and 3) shl 6) or (a[i + 3] and 63));
inc(i, 4);
end;
a := nil;
pc := @txt[1];
i := 1;
while i < length(txt) do
begin
result := result + pc^;
inc(i, 2);
inc(pc);
end;
result := trimright(result);
end;
// ---Beispielaufrufe ---
// verschlüsseln
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.caption := '';
case TabelleOK of
1:
showmessage('V128 enhält verbotene Zeichen');
2:
showmessage('V128 enhält doppelte Zeichen');
else
Label1.caption := encode('UNIݗࢯࢳ۞֏');
end;
end;
// entschlüsseln
procedure TForm1.Button2Click(Sender: TObject);
begin
Label2.ShowAccelChar := false;
Label2.caption := decode(Label1.caption);
end;
//--------------------------------------------------------------------- const
passwort = '1#-5ab8.*Z1'; // oder sonstwas
var
sss: string;
function verschluessele(zuverschluesseln, schluessel: string): string;
var x, y, lg: integer;
begin
result := '';
try
if length(zuverschluesseln) > 0 then begin
y := 1;
lg := length(schluessel);
for x := 1 to length(zuverschluesseln) do begin
result := result + formatfloat('000', ord(zuverschluesseln[x])
xor ord(schluessel[y]));
if y = lg then y := 1
else inc(y);
end;
end;
except result := ''; end;
end;
function entschluessele(zuentschluesseln, schluessel: string): string;
var x, y, lg: integer;
begin
result := '';
try
lg := length(zuentschluesseln);
if (lg > 0) and (lg mod 3 = 0) then begin
y := 1;
while y < lg do begin
result := result + chr(strtoint(copy(zuentschluesseln, y, 3)));
inc(y, 3);
end;
y := 1;
lg := length(schluessel);
for x := 1 to length(result) do begin
result[x] := chr(ord(result[x]) xor ord(schluessel[y]));
if y = lg then y := 1
else inc(y);
end;
end;
except result := ''; end;
end;
// Beispielaufruf
procedure TForm1.Button5Click(Sender: TObject);
begin
sss := verschluessele(Edit1.Text, passwort);
// showmessage(sss);
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
sss := entschluessele(sss, passwort);
// showmessage(sss);
end;
//--------------------------------------------------------------------- function Ver_Ent_Schl(txt: string; schlsl: longword; verschl: boolean): string;
var
x, p, n: Integer;
schluessel: string;
begin
result := '';
p := 0;
schluessel := inttostr(schlsl);
for x := 1 to length(txt) do begin
inc(p);
if p > length(schluessel) then p := 1;
if verschl then begin
n := ord(txt[x]) + ord(schluessel[p]);
if n > 255 then n := n - $E0;
end else begin
n := ord(txt[x]) - ord(schluessel[p]);
if n < 32 then n := n + $E0;
end;
result := result + chr(n);
end;
end;
const passw: longword = 165738904;
// Verschlüsseln (verschl=True)
procedure TForm1.Button2Click(Sender: TObject);
begin
label1.caption := Ver_Ent_Schl(Edit1.text, passw, True);
end;
// Entschlüsseln (verschl=False)
procedure TForm1.Button3Click(Sender: TObject);
begin
Label2.caption := Ver_Ent_Schl(Label1.caption, passw, False);
end;
//--------------------------------------------------------- // 6.
Verschlüsselung plus Zufall function verschl(txt, schl: string): string;
var x, y, lg, n: integer;
begin
result := '';
lg := length(schl);
y := 1;
randomize;
for x := 1 to length(txt) do begin
n := (byte(txt[x]) xor byte(schl[y])) or
(((random(32) shl 8) and 15872) or 16384);
if lo(n) < 32 then n := n or 384;
if y = lg then y := 1
else inc(y);
result := result + chr(lo(n)) + chr(hi(n));
end;
end;
function entschl(txt, schl: string): string;
var x, y, lg, n: integer;
begin
if not odd(length(txt)) then begin
result := '';
lg := length(schl);
y := 1;
x := 1;
while x < length(txt) do begin
n := (byte(txt[x]) or (byte(txt[x + 1]) shl 8));
if n and 256 > 0 then n := n and 127
else n := n and 255;
result := result + chr(n xor byte(schl[y]));
if y = lg then y := 1
else inc(y);
inc(x, 2);
end;
end else result := txt;
end;
// Beispielaufruf
const schlssl = 'h*09mÖ-X#z&5%A@+0';
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.text := verschl(edit1.text, schlssl);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.text := entschl(edit1.text, schlssl);
end;
//--------------------------------------------------------- // 7.
Verschlüsseln mit zwei Passwörtern function
Ver_Ent_Schl(txt: string; Methode: boolean; schl_1: Longint; schl_2: DWord):
string;
var
x, p, n, lg: Integer;
s: string;
begin
p := 0;
result := '';
randseed := schl_1;
s := inttostr(schl_2);
lg := length(s);
for x := 1 to length(txt) do begin
inc(p);
if p > length(s) then p := 1;
if Methode then begin
n := ord(txt[x]) + ord(s[p]) + random($70 + lg);
if n > 255 then n := n - $E0;
end else begin
n := ord(txt[x]) - ord(s[p]) - random($70 + lg);
if n < 32 then n := n + $E0;
end;
result := result + chr(n);
end;
end;
// Beispielaufruf
const
Key1 = 195678;
Key2 = 9854539;
// Verschlüsseln
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.text := Ver_Ent_Schl(Edit1.text, FALSE, key1, key2);
end;
// Entschlüsseln
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.text := Ver_Ent_Schl(Edit1.text, TRUE, key1, key2);
end;
//--------------------------------------------------------- // 8.
Verschlüsseln mit mehreren Passwörtern function
Ver_Ent_Schl(const txt: string; Methode: boolean; schlssl: array of DWord):
string;
var
n, h, i, j: integer;
ss: array of string;
lg, zl: array of byte;
begin
result := txt;
h := high(schlssl);
setlength(ss, h + 1);
setlength(zl, h + 1);
setlength(lg, h + 1);
for i := 0 to h do begin
ss[i] := inttostr(schlssl[i]);
lg[i] := length(ss[i]);
zl[i] := 1;
end;
for i := 1 to length(txt) do begin
n := byte(txt[i]);
for j := 0 to h do begin
if methode then begin
n := n + byte(ss[j][zl[j]]) + lg[j];
if n > 255 then n := n - $E0;
end else begin
n := n - byte(ss[j][zl[j]]) - lg[j];
if n < 32 then n := n + $E0;
end;
inc(zl[j]);
if zl[j] > lg[j] then zl[j] := 1;
end;
result[i] := char(n);
end;
zl := nil;
lg := nil;
ss := nil;
end;
// Verschlüsseln mit 3 Schlüsseln
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.text := Ver_Ent_Schl(Edit1.text, TRUE, [10296, 7913, 98765342]);
end;
// Entschlüsseln mit 3 Schlüsseln
procedure TForm1.Button3Click(Sender: TObject);
begin
Edit1.text := Ver_Ent_Schl(Edit1.text, FALSE, [10296, 7913, 98765342]);
end;
//--------------------------------------------------------- // 9.
"3Z"-Verschlüsselung function VE3Z(txt, schl: string; was: boolean): string;
var
i, z: integer;
a: array[0..2] of integer;
begin
if length(schl) > 2 then begin
result := '';
z := ord(was) * 2 - 1;
for i := 0 to 2 do
a[i] := ord(schl[i + 1]) - $F0;
for i := 1 to length(txt) do begin
if abs(a[0]) >= a[2] then a[1] := -a[1];
result := result + chr((ord(txt[i]) + a[0] * z) mod $100);
inc(a[0], a[1]);
end;
end else result := txt;
end;
// Verschlüsseln
procedure TForm1.Button5Click(Sender: TObject);
begin
memo1.text := VE3Z(memo1.text, 'ö!A', true);
end;
// Entschlüsseln
procedure TForm1.Button6Click(Sender: TObject);
begin
memo1.text := VE3Z(memo1.text, 'ö!A', false);
end;
// 9.1. Variante
von "3Z" für Unicode function VE3ZX(txt, schl: string; was: boolean): string;
var
i, z, x: integer;
a: array [0 .. 2] of integer;
begin
if length(schl) = 3 then
begin
result := '';
z := ord(was) * 2 - 1;
x := 0;
for i := 0 to 2 do
a[i] := ord(schl[i + 1]) - 31;
for i := 1 to length(txt) do
begin
result := result + chr((ord(txt[i]) + a[x] * z));
inc(x);
if x > 2 then
x := 0;
end;
end
else
result := txt;
end;
// Verschlüsseln
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.text := VE3ZX(Memo1.text, 'ö!A', true);
end;
// Entschlüsseln
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.text := VE3ZX(Memo1.text, 'ö!A', false);
end;
//
10.
Text-Verschlüsselung mit Sicherheitspasswort function EnCrypt(const txt, pw: string; out newpw: string): string;
var
x: integer;
v: cardinal;
P1, P2: PByte;
b: byte;
function MyRange(const von, bis: Integer): Integer;
begin
Result := Random(bis - von + 1) + von;
end;
function Zahl(pw: string): cardinal;
var x: integer;
begin
Result := 0;
if length(pw) < 3 then
raise exception.create('Das Kennwort muss mindestens 3 Zeichen haben!')
else pw := copy(pw, 1, 15);
for x := 1 to length(pw) do
Result := Result + ord(pw[x]) * (Random(7) + 1);
end;
function rechnen(const v: cardinal): cardinal;
begin
Result := (Random(v) + v * v * 13) or Random(v);
end;
begin
Randomize;
v := rechnen(zahl(pw));
setlength(Result, length(txt) * 2);
P1 := @txt[1];
P2 := @Result[1];
for x := 1 to length(txt) do begin
b := (v xor P1^) and $FF;
if b < 32 then begin
P2^ := MyRange(201, 255);
inc(P2);
P2^ := b + 32;
end else begin
p2^ := MyRange(32, 126);
inc(P2);
P2^ := b;
end;
inc(P2);
inc(P1);
end;
newpw := inttostr(v);
for x := 1 to length(newpw) do
if odd(x) then
newpw[x] := chr(ord(newpw[x]) + 49 + Random(2) * 10);
while length(newpw) < 10 do insert(chr(Random(3) + 120),
newpw, random(length(newpw) + 1) + 1);
end;
function DeCrypt(const txt: string; pw: string): string;
var
x: Integer;
v: cardinal;
P1, P2: PByte;
begin
try
x := 1;
pw := lowercase(pw);
while x <= length(pw) do
if ord(pw[x]) > 119 then delete(pw, x, 1)
else inc(x);
for x := 1 to length(pw) do
if odd(x) then begin
pw[x] := chr(ord(pw[x]) - 49 - ord(ord(pw[x]) > 106) * 10);
end;
v := strtoint(pw);
setlength(Result, length(txt) div 2);
P1 := @txt[1];
P2 := @Result[1];
x := 1;
while x < length(txt) do begin
if P1^ > 200 then begin
inc(P1);
P2^ := (v xor (P1^ - 32)) and $FF;
end else begin
inc(P1);
P2^ := (v xor P1^) and $FF;
end;
inc(P1);
inc(P2);
inc(x, 2);
end;
except
raise exception.create('Entschlüsselung nicht möglich!');
end;
end;
// Beispielaufruf
var
pwx: string; // Sicherheitspasswort
procedure TForm1.Button4Click(Sender: TObject);
begin
Memo1.lines.loadfromfile('c:\Test.txt');
Memo2.text := EnCrypt(Memo1.text, 'Mein Passwort', pwx);
Label1.caption := pwx;
Memo2.lines.savetofile('c:\verschl.txt');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
Memo1.lines.loadfromfile('c:\verschl.txt');
Memo2.text := DeCrypt(Memo1.text, pwx);
end;
//--------------------------------------------------------- // 11. Text-Verschlüsselung mit Vorbehandlung const
min = 1;
max = 31;
var
pwx: string = '#Mein Passwort#';
aos: array[min..max] of string =
('heit', 'keit', 'ung', 'le', 'ch', 'be', 'ei', 'em', 'ck', #10,
'ie', 'eu', #13, 'tt', 'ff', 'en', 'nn', 'gg', 'eh', 'ne', 'ig',
're', 'oh', 'an', 'la', 'mm', 'li', 'ss', 'er', 'au', 'he');
function verschl(txt, schl: string): string;
var
x, y, lg, n: integer;
begin
result := '';
if txt = '' then exit;
for x := min to max do
txt := stringreplace(txt, aos[x], chr(x), [rfreplaceall]);
lg := length(schl);
y := min;
randomize;
for x := min to length(txt) do begin
n := (byte(txt[x]) xor byte(schl[y])) or
(((random(32) shl 8) and 15872) or 16384);
if lo(n) < 32 then n := n or 384;
if y = lg then y := min
else inc(y);
result := result + chr(lo(n)) + chr(hi(n));
end;
end;
function entschl(txt, schl: string): string;
var
x, y, lg, n: integer;
begin
result := '';
if txt = '' then exit;
lg := length(schl);
y := min;
x := min;
while x < length(txt) do begin
n := (byte(txt[x]) or (byte(txt[succ(x)]) shl 8));
if n and 256 > 0 then n := n and 127
else n := n and 255;
result := result + chr(n xor byte(schl[y]));
if y = lg then y := min
else inc(y);
inc(x, 2);
end;
for x := min to max do
result := stringreplace(result, chr(x), aos[x], [rfreplaceall]);
end;
// Beispiel:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.lines.loadfromfile('c:\Test.txt');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.Text := verschl(Memo1.Text, pwx);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo3.Text := entschl(Memo2.Text, pwx);
end;
//--------------------------------------------------------- //
12. Ganz simple
Text-Verschlüsselung // Das älteste
bekannte militärische Verschlüsselungsverfahren wurde von den Spartanern var
Diameter: Word;
function Skytale(const txt: String; out upshot: String): Byte;
var
lg, i, st, x: Integer;
hlp, s: string;
begin
try
lg := Length(txt);
if lg = 0 then
begin
Result := 1;
exit;
end;
if Diameter > lg div 2 then
begin
Result := 2;
exit;
end;
if Diameter < 2 then
begin
Result := 3;
exit;
end;
if odd(lg) then
begin
s := txt + #32;
inc(lg);
end
else
s := txt;
upshot := '';
st := Diameter;
for i := 1 to lg do
begin
x := ord(s[st]);
if x = 255 then
x := 31;
hlp := chr(x + 1);
upshot := upshot + hlp;
inc(st, Diameter);
if st > lg then
st := st - succ(lg);
if st < 1 then
st := Diameter;
end;
s := '';
Result := 0;
except
Result := 255;
end;
end;
function SkytaleInterpret(const txt: String; out upshot: String): Byte;
var
lg, st, i, x: Integer;
begin
try
lg := Length(txt);
if lg = 0 then
begin
Result := 1;
exit;
end;
if (Diameter > lg div 2) or (Diameter < 2) then
begin
Result := 2;
exit;
end;
st := Diameter;
upshot := txt;
for i := 1 to lg do
begin
x := pred(ord(txt[i]));
if x = 31 then
x := 255;
upshot[st] := chr(x);
inc(st, Diameter);
if st > lg then
st := st - succ(lg);
if st < 1 then
st := Diameter;
end;
Result := 0;
except
Result := 255;
end;
end;
// --- Beispielaufrufe ---
// Verschlüsseln
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
b: Byte;
begin
Screen.Cursor := crHourGlass;
Button1.Enabled := False;
Application.ProcessMessages;
Memo1.Lines.BeginUpdate;
// Memo1.Text:='Das ist ein Test';
Memo1.Lines.LoadFromFile('C:\test.txt');
Diameter := 7; // z.B.
b := Skytale(Memo1.Text, s);
case b of
0:
Memo1.Text := s;
1:
Memo1.Text := 'Keinen Text zum Verschlüsseln gefunden';
2:
Memo1.Text := 'Diameter im Verhältnis zum Text zu groß';
3:
Memo1.Text := 'Diameter muss mindestens 2 sein';
else
Memo1.Text := 'Unerwarteter Fehler';
end;
s := '';
Memo1.Lines.EndUpdate;
Screen.Cursor := crDefault;
Button1.Enabled := True;
end;
// Entschlüsseln
procedure TForm1.Button2Click(Sender: TObject);
var
b: Byte;
s: string;
begin
Button2.Enabled := False;
Application.ProcessMessages;
Diameter := 7;
b := SkytaleInterpret(Memo1.Text, s);
case b of
0:
Memo2.Text := s;
1:
Memo2.Text := 'Keinen Text zum Entschlüsseln gefunden';
2:
Memo2.Text := 'Falscher Wert für Diameter';
else
Memo2.Text := 'Unerwarteter Fehler';
end;
s := '';
Button2.Enabled := True;
end;
|
Zugriffe seit
6.9.2001 auf Delphi-Ecke





