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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| {*******************************************************}
{ RC4 encryption unit }
{ October 2006, Codius }
{ Thanks to Michael Puff, shapeless }
{*******************************************************}
unit RC4;
interface
type
PByteArray = ^TByteArray;
TByteArray = array [0..32767] of Byte;
TRC4 = class
Private
D: array[Byte] of Byte;
I, J: Byte;
procedure Init(const Key: String);
procedure Done;
procedure Code(Source, Dest: Pchar; Count: Integer);
Public
function Encrypt(S: Pchar; const Password: String): Ansistring;
function Decrypt(S: Pchar; const Password: String): Ansistring;
end;
implementation
{ TRC4.Encrypt
This function will return the text(S) encrypted with the chosen password. }
function TRC4.Encrypt(S: Pchar; const Password: String): Ansistring;
begin
SetLength(Result, Length(S));
Init(Password);
Code(Pchar(S), Pchar(Result), Length(S));
Done;
end;
{ TRC4.Decrypt
This function will return the text(S) decrypted with the chosen password. }
function TRC4.Decrypt(S: Pchar; const Password: String): Ansistring;
begin
SetLength(Result, Length(S));
Init(Password);
Code(Pchar(S), Pchar(Result), Length(S));
Done;
end;
{ TRC4.Init
This routine will prepare the encryption/decryption. }
procedure TRC4.Init(const Key: String);
var
R, S, T, K: Byte;
U, L: Integer;
DummyArray: array [0..1599] of Char;
begin
{$R-}
{$Q-}
L := Length(Key);
I := 0;
J := 0;
R := 0;
U := 0;
for S := 0 to 255 do
D[S] := S;
for S := 0 to 255 do
begin
if (U < L) then
K := PByteArray(Key)[u]
else
K := 0;
Inc(U);
if (U >= L) then
U := 0;
Inc(R, D[S] + K);
T := D[S];
D[S] := D[R];
D[R] := T;
end;
Code(@DummyArray, @DummyArray, 1600);
end;
{ TRC4.Done
This routine will clean the variables used when encrypting/decrypting. }
procedure TRC4.Done;
begin
FillChar(D, sizeOf(D), 0);
FillChar(I, sizeOf(I), 0);
FillChar(J, sizeOf(J), 0);
end;
{ TRC4.Code
This routine will encrypt the text. }
procedure TRC4.Code(Source, Dest: Pchar; Count: Integer);
var
S: Integer;
T: Byte;
begin
for S := 0 to (Count - 1) do
begin
Inc(I);
T := D[i];
Inc(J, T);
D[i] := D[J];
D[J] := T;
Inc(T, D[i]);
Byte(Dest[S]) := Byte(Source[S]) Xor D[T];
end;
end;
end. |
Partager