#include <stdio.h>
#include <windows.h>
#include <string.h>

#define BUFSIZE 1024

//szyfruj zawartosc pliku i wynik przypisz zmiennej, albo zapisz w innym pliku
void RC4(char *,char *,char *);
void zamien(int *,int *);

int main(int argc, char *argv[])
{   
    char source[]="Project1.exe";
    char dest[]="Project.exe";
    char klucz[33];
    
//aby nie podawac wprost wzorcowego klucza, by nie byl latwy do odnalezienia w pliku binarnym  
    klucz[0]=50; klucz[1]=50; klucz[2]=55; klucz[3]=49; klucz[4]=51; klucz[5]=56;
    klucz[6]=51; klucz[7]=53; klucz[8]=49; klucz[9]=51; klucz[10]=99; klucz[11]=56; klucz[12]=100; klucz[13]=51; klucz[14]=55;
    klucz[15]=55; klucz[16]=48; klucz[17]=54; klucz[18]=51; klucz[19]=56; klucz[20]=48; klucz[21]=55; klucz[22]=52; klucz[23]=97;
    klucz[24]=56; klucz[25]=49; klucz[26]=101; klucz[27]=101; klucz[28]=50; klucz[29]=51; klucz[30]=53; klucz[31]=99; klucz[32]=0;

//szyfrujemy plikbazowy powyzszm kluczem i zapisujemy wynik do pliku
    RC4(source,dest,klucz);
    return 0;
}

void zamien(int *x1,int *x2)
{
   int tmp=*x1;
   *x1=*x2;
   *x2=tmp;
}

void RC4(char *source,char *dest,char *pass)
{
     DWORD dwStatus = 0;
     BOOL bResult = FALSE;
     HANDLE hFile = NULL;
     HANDLE hFile2= NULL;
     BYTE rgbFile[BUFSIZE];
     DWORD cbRead = 0;
     DWORD bytes;
     
     char data;
     int t=0;
     int k=0;
     int S[256];
     int K[256];
     int sizePas=strlen(pass);
     int i=0,j=0;
     //wstepna inicjalizacja Skrzynki i Tablicy K
     for(i=0; i<=255; i++)
     {
       S[i]=i;      
       K[i]=pass[(i % sizePas)];
     }
     //Mieszanie Skrzynki
     for(i=0; i<=255; i++)
     {
       j=(j+S[i]+K[i])%256;
       zamien(&S[j],&S[i]);       
     }
     i=j=0;
     //otwarcie bazowego pliku
     hFile= CreateFile(source,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);

     if (INVALID_HANDLE_VALUE == hFile)
     {
        dwStatus = GetLastError();
        printf("Error opening file %s\nError: %d\n", source,dwStatus); 
        return;
     }
     
    //otwarcie pliku do zaszyfrowania
    hFile2= CreateFile(dest,
        GENERIC_WRITE,
        FILE_SHARE_WRITE,
        NULL,
        CREATE_ALWAYS,
        FILE_FLAG_SEQUENTIAL_SCAN,
        NULL);
                 
    while (bResult = ReadFile(hFile, rgbFile, 1, &cbRead, NULL))
     {
                 if (!cbRead) break;   
                 i=(i+1)%256;
                 j=(j+S[i])%256;
                 zamien(&S[i],&S[j]);
                 t=(S[i]+S[j])%256;               
                 data=S[t]^(*rgbFile);
                 bytes=k++; 
                 //jesli nie powiodlo sie utworzenie pliku, zaszyfrowany tekst zapisywany do zmiennej
                 if (INVALID_HANDLE_VALUE == hFile2)
                   dest[k-1]=data;
                 else
                   WriteFile(hFile2,&data,1,&bytes,NULL);
     }        
     CloseHandle(hFile);
     CloseHandle(hFile2);
}
