//Szyfr przestawieniowy
//pobrano ze strony www.sprawozdania.info

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main()
{
int szyfrowanie(int *tab);
int deszyfrowanie(int *tab);
int* zamiana(int ilosc);
int strona_gl(int *tab);

int x,licznik_1, licznik_2,buf, tab[2000],ziarno;

ziarno=0;

clrscr();

gotoxy(21,2);
printf("SZYFROWANIE PRZEZ PODSTAWIANIE");
gotoxy(20,20);
printf("program wykonal GEGE");
gotoxy(20,22);
printf("www.sprawozdania.info");
gotoxy(20,10);
printf("Standardowe ziarno = 0");
gotoxy(20,12);
printf("Podaj ziarno: ");
scanf("%d",&ziarno); getchar();

gotoxy(20,14);
printf("ziarno = %d",ziarno); delay(800);

srand(ziarno);
licznik_2=0;

//zapelnianie tablicy wartosciami 0..1999 <=> kody ASCII
for(licznik_1=0;licznik_1<=1999;licznik_1++)
tab[licznik_1]=licznik_1;


for(licznik_1=1;licznik_1<=100;licznik_1++) //ponizsza zamiana wyk. 100 razy
{
		for(licznik_2=0;licznik_2<=999;licznik_2++) //zamiana miejscami
		{                                    // 0..999<=>1000..1999
		x=random(1000-1)+1000;
		buf=tab[licznik_2];
		tab[licznik_2]=tab[x];
		tab[x]=buf;
		}
}

strona_gl(tab);

return 0;
}



int* zamiana(int ilosc)
{
int *t_1, licznik_1, licznik_2, x,buf;

t_1=(int*)malloc(ilosc*sizeof(int));

   for(licznik_1=0;licznik_1<ilosc;licznik_1++)
   t_1[licznik_1]=licznik_1;


for(licznik_1=1;licznik_1<=100;licznik_1++) //ponizsza zamiana wyk. 100 razy
{
		for(licznik_2=0;licznik_2<ilosc/2;licznik_2++) //zamiana miejscami
		{
		x=random(ilosc/2-1)+ilosc/2;
		  if((x<0)||(x>=ilosc)) {x=x-1; printf("\nbbb"); getchar();}
		buf=t_1[licznik_2];
		t_1[licznik_2]=t_1[x];
		t_1[x]=buf;
		}
}

return t_1;
}




int szyfrowanie(int *tab)
{
FILE *plik_odczyt, *plik_zapis;
char sciezka_1[12], sciezka_2[12];
int ilosc, licznik_1, licznik_2, *t_1;
unsigned char tablica_1[2000], tablica_2[2000];


clrscr();

gotoxy(10,10);
printf("Podaj sciezke dostepu pliku zrodlowego: ");
gets(sciezka_1);

plik_odczyt=fopen(sciezka_1,"rb");

	if(!plik_odczyt)
	{
	gotoxy(26,14);
	printf("Blad otwarcia pliku %s", sciezka_1);
	delay(2000);
	return (0);
	}


gotoxy(10,12);
printf("Podaj sciezke dostepu pliku zaszyfrowanego: ");
gets(sciezka_2);


plik_zapis=fopen(sciezka_2,"wb+");

	if(!plik_zapis)
	{
	gotoxy(26,14);
	printf("Blad otwarcia pliku %s", sciezka_2);
	delay(2000);
	return (0);
	}


clrscr();
gotoxy(20,10);
printf("Trwa szyfrowanie. Prosze czekac...");


while((ilosc=(fread(tablica_1,sizeof(char),2000,plik_odczyt)))==2000) //wczytanie do tablicy 2kb
	{
	   for(licznik_1=0;licznik_1<=1999;licznik_1++)
	   tablica_2[tab[licznik_1]]=tablica_1[licznik_1];     //szyfrowanie

	   fwrite(tablica_2,sizeof(char),2000,plik_zapis);

	}

if(ilosc>0)
{

t_1=zamiana(ilosc);


fread(tablica_1,sizeof(char),ilosc,plik_odczyt);

for(licznik_1=0;licznik_1<ilosc;licznik_1++)
  tablica_2[t_1[licznik_1]]=tablica_1[licznik_1];     //szyfrowanie

  fwrite(tablica_2,sizeof(char),ilosc,plik_zapis);

}

  fclose(plik_odczyt);
  fclose(plik_zapis);

clrscr();

gotoxy(14,10);
printf("Operacja szyfrowania wykonana pomyslnie.");

gotoxy(20,12);
printf("Nacisnij <ENTER> ...");

getchar();

return 0;

}


int deszyfrowanie(int *tab)
{
FILE *plik_odczyt, *plik_zapis;
char sciezka_1[12], sciezka_2[12];
int ilosc, licznik_1,licznik_2, *t_1;
unsigned char tablica_1[2000], tablica_2[2000];

clrscr();

gotoxy(10,10);
printf("Podaj sciezke dostepu pliku zaszyfrowanego: ");
gets(sciezka_1);

plik_odczyt=fopen(sciezka_1,"rb");

	if(!plik_odczyt)
	{
	gotoxy(26,14);
	printf("Blad otwarcia pliku %s", sciezka_1);
	delay(2000);
	return (0);
	}


gotoxy(10,12);
printf("Podaj sciezke dostepu pliku odszyfrowanego: ");
gets(sciezka_2);

plik_zapis=fopen(sciezka_2,"wb+");

	if(!plik_zapis)
	{
	gotoxy(26,14);
	printf("Blad otwarcia pliku %s", sciezka_2);
	delay(2000);
	return (0);
	}

clrscr();
gotoxy(20,10);
printf("Trwa deszyfrowanie. Prosze czekac...");


	while((ilosc=(fread(tablica_1,sizeof(char),2000,plik_odczyt)))==2000) //wczytanie do tablicy 2kb
	{
	for(licznik_1=0;licznik_1<=1999;licznik_1++)
	 for(licznik_2=0;licznik_2<=1999;licznik_2++)
	  if(licznik_1==tab[licznik_2])
	  tablica_2[licznik_2]=tablica_1[licznik_1]; //deszyfrowanie

	  fwrite(tablica_2,sizeof(char),2000,plik_zapis);
	  }


if(ilosc>0)
{

t_1=zamiana(ilosc);


fread(tablica_1,sizeof(char),ilosc,plik_odczyt);

//deszyfrowanie
    for(licznik_1=0;licznik_1<ilosc;licznik_1++)
      for(licznik_2=0;licznik_2<ilosc;licznik_2++)
       if(licznik_1==t_1[licznik_2])
       {
       tablica_2[licznik_2]=tablica_1[licznik_1]; //deszyfrowanie
       }

  fwrite(tablica_2,sizeof(char),ilosc,plik_zapis);
}

  fclose(plik_odczyt);
  fclose(plik_zapis);

clrscr();

gotoxy(14,10);
printf("Operacja deszyfrowania wykonana pomyslnie.");

gotoxy(20,12);
printf("Nacisnij <ENTER> ...");

getchar();

return 0;

}



int strona_gl(int *tab)
{
char znak;

do{
clrscr();

gotoxy(21,2);
printf("SZYFROWANIE PPZEZ PRZESTAWIANIE");
gotoxy(22,6);
printf("Jaka operacje chcesz wykonac?");
gotoxy(22,8);
printf("1 - szyfrowanie");
gotoxy(22,10);
printf("2 - deszyfrowanie");
gotoxy(22,12);
printf("q - wyjscie");
gotoxy(20,18);
printf("program wykonal GEGE");
gotoxy(20,20);
printf("www.sprawozdania.info");

	znak=getch();

	switch(znak){
	case '1':szyfrowanie(tab); return 0;
	case '2':deszyfrowanie(tab); return 0;
	case ('q'): return 0;
	case ('Q'): return 0;
	default: gotoxy(22,14); printf("Nacisnij '1', '2' lub 'q'");
		sound(2000);  delay(500);  nosound();}

}while((znak!='1')&&(znak!='2'));

return 0;
}