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

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

int main()
{
int strona_gl(unsigned char *tab);
int szyfrowanie(unsigned char *tab);
int deszyfrowanie(unsigned char *tab);
int szyfr_i_deszyfr(unsigned char *tab);

unsigned char tab[256],buf,x,znak;
int licznik_1,licznik_2,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);


//zapelnianie tablicy wartosciami 0..255 <=> kody ASCII
for(licznik_1=0;licznik_1<=255;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<=127;licznik_2++) //zamiana miejscami
	{                                          // 0..127<=>128..255
	x=random(128)+128;
	buf=tab[licznik_2];
	tab[licznik_2]=tab[x];
	tab[x]=buf;
	}
}

strona_gl(tab);

return 0;
}


int szyfrowanie(unsigned char *tab)
{
FILE *plik_odczyt, *plik_zapis;
unsigned char znak;
char sciezka_1[12], sciezka_2[12];
int licznik_1;

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(fread(&znak,sizeof(char),1,plik_odczyt)==1)
{
znak=tab[znak];              //szyfrowanie
fwrite(&znak,sizeof(char),1,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(unsigned char *tab)
{
FILE *plik_odczyt, *plik_zapis;
unsigned char znak;
char sciezka_1[12], sciezka_2[12];
int licznik_1;

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(fread(&znak,sizeof(char),1,plik_odczyt)==1) //deszyfrowanie
{
	for(licznik_1=0;licznik_1<=255;licznik_1++)
	if(tab[licznik_1]==znak)
	{
	znak=licznik_1;
	fwrite(&znak,sizeof(char),1,plik_zapis);
	break;
	}
}

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(unsigned char *tab)
{
char znak;

do{
clrscr();

gotoxy(21,2);
printf("SZYFROWANIE PPZEZ PODSTAWIANIE");
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,20);
printf("program wykonal GEGE");
gotoxy(20,22);
printf("www.sprawozdania.info");

	znak=getch();

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

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

return 0;
}