//Autor: Artur Czekalski (Sator) www.epokaY.net/artur artur@epokaY.net //Szyfrowanie RC4 program Project1; {$APPTYPE CONSOLE} uses SysUtils, windows; //--------------------------------------------------------------------------- const gDlTablicy: Cardinal = 10000000; //rozmiar tablicy var gTablica: array [0..10000000-1] of Byte; //tablica do szyfrowania gZnaki: string[16] = '0123456789ABCDEF'; //dla Hex //--------------------------------------------------------------------------- Procedure SzyfrujRC4(const DlTablicy: Cardinal; var Tablica: array of Byte; const DlHasla: Cardinal; var Haslo: array of Byte); var i, j, x, Index: Cardinal; perm: array [0..255] of Cardinal; //permutacja begin //---inicjalizacja--- For i:=0 To 255 Do perm[i] := i; j := 0; For i:=0 To 255 Do begin j := (j + perm[i] + Haslo[i mod DlHasla]) mod 256; x:=perm[i]; perm[i]:=perm[j]; perm[j]:=x; //perm[i]<->perm[j] end; //---szyfrowanie--- i := 0; Index := 0; while Index < DlTablicy Do begin i := (i+1) mod 256; j := (j + perm[i]) mod 256; x:=perm[i]; perm[i]:=perm[j]; perm[j]:=x; //perm[i]<->perm[j] Tablica[Index] := Tablica[Index] xor perm[(perm[i]+perm[j]) mod 256]; //XOR Inc(Index); end; end; //--------------------------------------------------------------------------- procedure Hex(a: Byte); //zapisuje Bajt w systemie 16-owym begin write(gZnaki[(a div 16)+1]); write(gZnaki[(a mod 16)+1]); end; //=========================================================================== var i: Integer; czas: Cardinal; ciag: string[16]; Haslo: array[0..16-1] of Byte; //dodatkowa tablica, żeby typy były zgodne :( DlHasla: Cardinal; begin ciag := 'sator'; DlHasla := length(ciag); For i:=0 To DlHasla-1 Do Haslo[i] := Ord(ciag[i+1]); //trzeba skopiować ciąg, bo typy :( //---Spr. //For i:=0 To DlHasla-1 Do begin Hex(Haslo[i]); write(' '); end; writeln; For i:=0 To 9 Do gTablica[i] := Ord('a')+i; writeln('Przed szyfrowaniem:'); For i:=0 To 9 Do begin Hex(gTablica[i]); write(' '); end; SzyfrujRC4(gDlTablicy, gTablica, DlHasla, Haslo); writeln(#10'Po szyfrowaniu:'); For i:=0 To 9 Do begin Hex(gTablica[i]); write(' '); end; //---TEST For i:=0 To gDlTablicy-1 Do gTablica[i] := 0; czas := GetTickCount; For i:=1 To 500 Do SzyfrujRC4(gDlTablicy, gTablica, DlHasla, Haslo); czas := GetTickCount - czas; //---Spr. writeln(#10'Po szyfrowaniu:'); For i:=0 To 24 Do begin Hex(gTablica[i]); write(' '); end; write(#10'Delphi 7: uint A3B2 Czas=', czas); readln; end.