RC4

Previous  Top  Next

    
 

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

 

Code:

///////////////////////////////////////////////////

///////////////////Шифр 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

©Drkb::03986

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