Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

RC4

01.01.2007

RC4:
Симметричный алгоритм шифрования поточного вида.
Переменная длина ключа.
Для зашифровки/расшифровки применяют один и тот же ключ.

Был рассекречен в середине 90-х анонимным лицом,в интернете.

///////////////////////////////////////////////////
///////////////////Шифр RC4////////////////////////
///////////////////////////////////////////////////
unit RC4
;
 
var
   s
: array [0..255] of Byte;
 i
,j: Byte;
 
//Инициализация S-Box'а
procedure InitRC4Cipher
(key: ShortString);
var
     k
: array [0..255] of Byte;
     t
: Byte;
     l
: Cardinal;
 i0
,j0: Byte;
 
begin
 
for i0 := 0 to 255 do s[i0] := i0;
 
  j0
:= 1; l := Length(key);
 
for i0 := 0 to 255 do
   
begin
      k
[i0] := Ord(key[j0]);
     
if j0 = l then j0 := 0;
     
Inc(j0);
   
end;
 
 
for i0 := 0 to 255 do
   
begin
      j0
:= (j0 + k[i0] + s[i0]) mod 256;
 
      t    
:= s[i0];
      s
[i0] := s[j0];
      s
[j0] := t;
   
end;
 
  i
:= 0;
  j
:= 0;
end;
 
//Шифрование конкретного символа
function GetRC4ByteCiphered(bt: Byte): Byte;
var
  t
: Byte;
 
begin
  i
:= (i + 1)    mod 256;
  j
:= (j + s[i]) mod 256;
 
  t    
:= s[i];
  s
[i] := s[j];
  s
[j] := t;
 
  t
:= (s[i] + s[j]) mod 256;
 
 
Result := bt XOR s[t];
end;
 
//Применения шифра к данным потока
function ApplyRC4ToData(InitialData: TStream; var Buffer: TStream; key: ShortString): Boolean; stdcall;
var
  i
: Cardinal;
  d
: Byte;
 
begin
 
if (key = '')OR(Buffer = InitialData)OR(Buffer = nil)OR(InitialData = nil)OR(InitialData.Size = 0)OR(Buffer.Size <> 0) then
   
begin
     
Result := false;
     
Exit;
   
end;
 
  InitRC4Cipher
(key);
 
 
try
   
InitialData.Position := 0;
   
for i := 0 to InitialData.Size-1 do
     
begin
       
InitialData.ReadBuffer(d,1);
        d
:= GetRC4ByteCiphered(d);
       
Buffer.WriteBuffer(d,1);
     
end;
 
except
   
Result := false;
   
Exit;
 
end;
 
 
InitialData.Position  := 0;
 
Buffer.Position := 0;
 
 
Result := true;
end;

Автор: MakedoneZ

Взято из https://forum.sources.ru