-
Notifications
You must be signed in to change notification settings - Fork 0
/
dtinyarc4.pas
71 lines (63 loc) · 1.66 KB
/
dtinyarc4.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
unit dtinyarc4;
// tinyARC4, ARC4 stream cypher. based on code by Mike Shaffer.
// - rlyeh, public domain ~~ listening to Black Belt - Leeds | wtrmrkrlyeh
// - ported to pascal by Doj
{$MODE FPC}
{$MODESWITCH DEFAULTPARAMETERS}
{$MODESWITCH OUT}
{$MODESWITCH RESULT}
interface
function tinyARC4(const Text, PassKey: AnsiString): AnsiString;
implementation
function tinyARC4(const Text, PassKey: AnsiString): AnsiString;
var
sbox: array[0 .. 256 - 1] of UInt8;
Temp: UInt8;
plen, tlen: SizeInt;
a, b, i, j, k: SizeInt;
begin
tlen := Length(Text);
plen := Length(PassKey);
if plen <> 0 then begin
SetLength(Result, tlen);
for a := 0 to 256 - 1 do
sbox[a] := a;
b := 0;
for a := 0 to 256 - 1 do begin
b := (b + sbox[a] + Ord(PassKey[(a mod plen) + 1])) mod 256;
Temp := sbox[a];
sbox[a] := sbox[b];
sbox[b] := Temp;
end;
i := 0;
j := 0;
for a := 0 to tlen - 1 do begin
i := (i + 1) mod 256;
j := (j + sbox[i]) mod 256;
Temp := sbox[i];
sbox[i] := sbox[j];
sbox[j] := Temp;
k := sbox[(sbox[i] + sbox[j]) mod 256];
Result[a + 1] := AnsiChar(Ord(Text[a + 1]) xor k);
end;
end else
Exit(Text);
end;
//
// var
// Encrypted, Decrypted: AnsiString;
//
// begin
// // sample
// Encrypted := tinyARC4('Hello world.', 'my-password');
// Decrypted := tinyARC4(Encrypted, 'my-password');
//
// Writeln('ARC4 Encrypted text: ', Encrypted);
// Writeln('ARC4 Decrypted text: ', Decrypted);
//
// // tests
// Assert(tinyARC4('hello world', 'my key') <> 'hello world');
// assert(tinyARC4(tinyARC4('hello world', 'my key'), 'my key') = 'hello world');
// end.
//
end.