//Autor: Artur Czekalski (Sator)  www.epokaY.net/artur  artur@epokaY.net
//Szyfrowanie RC4
#include <stdio.h> //printf
#include <windows.h> //GetTickCount()
//---------------------------------------------------------------------------
const unsigned int gDlTablicy = 10000000;
unsigned char gTablica[gDlTablicy];
//---------------------------------------------------------------------------
inline void SzyfrujRC4(const unsigned int DlTablicy, unsigned char *Tablica,
                        const unsigned int DlHasla, const unsigned char *Haslo)
{
 unsigned int i, j,  x,  perm[256]; //permutacja
 //---inicjalizacja---
 for (i=0; i<256; ++i) perm[i] = i;
 j = 0;
 for (i=0; i<256; ++i)
  {j = (j + perm[i] + Haslo[i % DlHasla]) % 256;
   x=perm[i];  perm[i]=perm[j];  perm[j]=x; //perm[i]<->perm[j]
  }
 //---szyfrowanie---
 i = 0;
 unsigned int Index = 0;
 while (Index < DlTablicy)
  {
   i = (i+1) % 256;
   j = (j + perm[i]) % 256;
   x=perm[i];  perm[i]=perm[j];  perm[j]=x; //perm[i]<->perm[j]
   Tablica[Index++] ^= (unsigned char)perm[(perm[i]+perm[j]) % 256]; //XOR
  }
};
//===========================================================================
int main(int, char* [])
{int i, czas;
 unsigned char Haslo[16] = "sator";
 unsigned int DlHasla = 5;
  //---Spr.
 for (i=0; i<10; ++i) gTablica[i] = (unsigned char)('a'+i);
 printf("Przed szyfrowaniem:\n");  for (i=0; i<10; ++i) printf("%02X ", (int)gTablica[i]);
 SzyfrujRC4(gDlTablicy, gTablica,  DlHasla, Haslo);
 printf("\nPo szyfrowaniu:\n");  for (i=0; i<10; ++i) printf("%02X ", (int)gTablica[i]);
 //---Test
 for (i=0; i<gDlTablicy; ++i) gTablica[i] = (unsigned char)0;
 czas = GetTickCount();
 for (i=0; i<500; ++i)
  SzyfrujRC4(gDlTablicy, gTablica,  DlHasla, Haslo);
 czas = GetTickCount() - czas;
 //---
 printf("\nPo szyfrowaniu:\n");  for (i=0; i<25; ++i) printf("%02X ", (int)gTablica[i]);
 printf("\nVisual C++ 6.0: Czas=%d", czas);
 getchar();  return 0;
}