Страница 2 из 2

Re: Задача на шифровку в С++

Добавлено: 20 май 2008, 18:03
void_main
А можно как-нибудь по научнее чтоли, просто это моё курсовое задание, его ещё вчера надо было сдать...если не трудно

Re: Задача на шифровку в С++

Добавлено: 20 май 2008, 19:01
BAHTY3
Нарыл вот в архивах... Писал года так 3 назад... Программка сразу шифрует и дешефрует, ключь забит руками, файло любое (хоть текст, хоть картинки или музыка... только не бери то что много весит, долго ждать будеш), но можеш переделать его на ввод с клавиатуры ;) считай, что по паролю тогда будет :)

Код: Выделить всё

//Реализация шифрации данных на основе регистра сдвига.
#include<iostream.h>
#include<math.h>
int reg[128]={0,0,1,1,0,0,1,1,0,0,0,1,0,0,1,1,0,1,0,0,1,0,0,1,1,0,0,0,1,0,0,1,1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0,1,0,0,0,0,1}; 
int TempMass[128];//хранит сдвиг регистра во время выполнения функций
int tkey[128];
int NumBin[8];
int tempIn[128];
int tempOut[128];
char UnCodeFileName[100];
char CodeFileName[100];

int Bin2Dec(int N[8])
{
	int i=0;
	int NumDec=0;

	for(i=7;i>-1;i--){
		if(N[i]==1){
			NumDec=NumDec+pow(2,7-i);
		}
	}
	
	return NumDec;
}

void Dec2Bin(int NumDec)
{
	int i=0;

	for(int y=0;y<8;y++){
    		NumBin[y]=0;
    	}
    	
	i=7;	

	while(NumDec>0){
		NumBin[i]=NumDec%2;
		NumDec=NumDec/2;
		i--;
	}

}//end of Dec2Bin()

void Shiftfunc(int mass[128])//функция сдвига регистра
{
	int tempmass[128];
	int i;
	int j;
	
	j=0;
	tempmass[j]=mass[127];
	j=1;
	
	for(i=0;i<128;i++){
		tempmass[j]=mass[i];
		j++;
	}

	for(i=0;i<128;i++){
		TempMass[i]=tempmass[i];
	}
}//end of Shiftfunc()

void XoRFunc(int String[128])
{
	int temp[128];
	int i=0;

	while(i<128){
		temp[i]=(String[i]+TempMass[i])%2;
		i++;
	}

	for(i=0;i<128;i++){
		tkey[i]=temp[i];
	}  
}//end of XoRFunc()

void CodeFunc(int mass[128])
{
	FILE *out;
	char tempch;
	char filename[100];
	int temp[8];
	int i;
	int q;
	int j;
	int k;
	int sq;
	int num;
	
	filename[0]=0;
	sprintf(filename,"code");

	if((out=fopen(filename,"a+"))==NULL){
		printf("Can not open file code!\n");
	}
  
	k=q=sq=0;
	
	while(sq<128){
		k=0;
		
		for(i=0;i<8;i++){
			temp[i]=mass[sq];
			sq++;
		}
		
		num=Bin2Dec(temp);
		num=num%256;
		tempch=num;
		fprintf(out,"%c",tempch);
	}
	
	fclose(out);
}//end of CodeFunc()

int UncodeFunc(int mass[128])
{
	FILE* unc;
	char tempch;
	int temp[8];
	int i;
	int q;
	int j;
	int k;
	int sq;
	int num;
	
	if((unc=fopen(UnCodeFileName,"ab+"))==NULL){
	        printf("Can not open file code!\n");
	}
  
	k=q=sq=0;
	
	while(sq<128){
		k=0;
		
		for(i=0;i<8;i++){
			temp[i]=mass[sq];
			sq++;
		}
		
		num=Bin2Dec(temp);
		num=num%256;
		Dec2Bin(num);
		
		for(j=q;j<q+8;j++){
	 		tempOut[j]=NumBin[k];
	 		k++;
	 	}
	 	
	 	q=j;
	}
	
	sq=0;
			
	while(sq<128){
		for(i=0;i<8;i++){
			temp[i]=tempOut[sq];
			sq++;
		}
		
		num=Bin2Dec(temp);
		tempch=num;
		fprintf(unc,"%c",tempch);
	}
	
	fclose(unc);
}//end of UncodeFunc()

int main()
{
	FILE *in;
	int TempReg[128];
	int *temp;
	char filename[100];
	char TempString[129];
	char infile[100];
	int InString[128];
	int OutString[128];
	int insymbol;
	int fsize=0;
	int q;
	int i;
	int j;
	int k;
	int N;

	for(i=0;i<128;i++){
		TempMass[i]=reg[i];
	}
	
	cout << "Start." << endl;
	cout << "Insert InFile:" << endl;
	cin >> CodeFileName;
	cout << "Insert OutFile:" << endl;
	cin >> UnCodeFileName;
	filename[0]=0;

	if((in=fopen(CodeFileName,"rb+"))==NULL){
		printf("Can not open file in.txt!\n");
	}

	i=j=q=k=0;
	fseek(in,0,SEEK_END);
	fsize=ftell(in);
	fseek(in,0,SEEK_SET);

	while(i<fsize){//кодирование файла
		insymbol=fgetc(in);
 		Dec2Bin(insymbol);
 		k=0;
 		
 		for(j=q;j<q+8;j++){
 			InString[j]=NumBin[k];
 			k++;
 		}
 		
 		q=j;
 		
 		if(q==128){
 			Shiftfunc(TempMass);
 			XoRFunc(InString);
 			CodeFunc(tkey);
 			
 			for(j=0;j<128;j++){
 				InString[j]=0;
 			} 			
 			j=q=0;
 		} 		
 		i++;
	}

	Shiftfunc(TempMass);
	XoRFunc(InString);
	CodeFunc(tkey);
	fclose(in);	 	
	filename[0]=0;
	sprintf(filename,"code");

	if((in=fopen(filename,"r+"))==NULL){
		printf("Can not open file code!\n");
	}
	  
	for(i=0;i<128;i++){
		TempMass[i]=reg[i];
	}
		
	i=j=q=k=0;
	fseek(in,0,SEEK_END);
	fsize=ftell(in);
	fseek(in,0,SEEK_SET);
	  
	while(i<fsize){//декодирование файла
	  	insymbol=fgetc(in);
 		Dec2Bin(insymbol);
 		k=0;
 		
 		for(j=q;j<q+8;j++)
 		{
 			OutString[j]=NumBin[k];
 			k++;
 		}//end of for()
 		
 		q=j;
 		
 		if(q==128){
 			Shiftfunc(TempMass);
 			XoRFunc(OutString);
 			UncodeFunc(tkey);
 			
 			for(j=0;j<128;j++){
 				OutString[j]=0;
 			} 			
 			j=q=0;
 		} 		
 		i++;
	}

	fclose(in);
	in=fopen("code","w");
	fclose(in);
  	cout << "End." << endl;
  	return 0;
}
P.S.: вопросы в аську, ибо нефиг на форуме флудить по простым задачам и рабочему коду ;)