Скачиваний:
64
Добавлен:
17.04.2013
Размер:
8.17 Кб
Скачать
// G(H)ost

#include <iostream>
#include <fstream>
#include <time.h>
using namespace std;

typedef unsigned long ulong;

class Ecrypt{
	public:
	
	ulong key[8];
	ulong Ekey[32];
	
	ulong box[8][16];	
	ulong Ebox[(1<<17)];
	
	ulong N1,N2;
	ulong S;
	
	ulong temp,dischange;
	
	Ecrypt(){
		   int i,j;
   		for(i=0;i<8;i++)
   			key[i]=0;
   		for(i=0;i<8;i++)
   			for(j=0;j<16;j++)
   				box[i][j]=0;
   				
   	N1=N2=S=temp=dischange=0;			
	}
	
 	void Einit(ulong k[8],ulong b[8][16]){
   		int i,j;
   		for(i=0;i<8;i++)
   			key[i]=k[i];
   		for(i=0;i<8;i++)
   			for(j=0;j<16;j++){
	   			if(b[i][j]>(1<<4))
	   				cout<<b[i][j];
   				box[i][j]=b[i][j];
   			}	
   				
	}
	
	void E(){
		for(int i=0;i<3;i++)
			for(int j=0;j<8;j++)
			Ekey[i*8+j]=key[j];
		for(int j=0;j<8;j++)
			Ekey[31-j]=key[j];
			
		ulong cum;
		
		for(ulong i=0;i<(1<<16);i++){
			cum=0;
			cum|=box[7][(i>>12)&0xf];
			cum<<=4;
			cum|=box[6][(i>>8)&0xf];
			cum<<=4;
			cum|=box[5][(i>>4)&0xf];
			cum<<=4;
			cum|=box[4][(i)&0xf];
			Ebox[i]=cum;
		}		
		for(int i=0;i<(1<<16);i++){
			cum=0;
			cum|=box[3][(i>>12)&0xf];
			cum<<=4;
			cum|=box[2][(i>>8)&0xf];
			cum<<=4;
			cum|=box[1][(i>>4)&0xf];
			cum<<=4;
			cum|=box[0][(i)&0xf];
			Ebox[i+(1<<16)]=cum;
		}
		
//		cout<<Ebox[0x2432]<<' '<<0xE65A<<endl;
	}
	
	void D(){
		for(int i=0;i<8;i++)
			Ekey[i]=key[i];
		for(int i=2;i<5;i++)
			for(int j=7;j>=0;j--)
				Ekey[(i)*8-j-1]=key[j];
			
		ulong cum;
		
		for(ulong i=0;i<(1<<16);i++){
			cum=0;
			cum|=box[7][(i>>12)&0xf];
			cum<<=4;
			cum|=box[6][(i>>8)&0xf];
			cum<<=4;
			cum|=box[5][(i>>4)&0xf];
			cum<<=4;
			cum|=box[4][(i)&0xf];
			Ebox[i]=cum;
		}		
		for(int i=0;i<(1<<16);i++){
			cum=0;
			cum|=box[3][(i>>12)&0xf];
			cum<<=4;
			cum|=box[2][(i>>8)&0xf];
			cum<<=4;
			cum|=box[1][(i>>4)&0xf];
			cum<<=4;
			cum|=box[0][(i)&0xf];
			Ebox[i+(1<<16)]=cum;
		}
		
	}
	
	void Eblock(ulong &n1,ulong &n2){
			N2=n2;N1=n1;// (N2N1) 
		for(int i=0;i<32;i++){
   		S=N1+Ekey[i]; //  (s+n1)mod2^32
  		
   		temp=(S>>16); // box mixing
   		dischange=Ebox[temp];
	  		dischange<<=16;
   		temp=(S&0xffff);
   		dischange|=Ebox[temp+(1<<16)];
   		S=dischange;  		   		   		
   		
   		temp=S; // 11 bit circle
   		temp>>=(32-11);
   		S<<=11;
   		S|=temp;   			
   		
   		S=S^N2; // (+) mod2
   		
   		N2=N1;N1=S; // mix N1<->N2
   		
   	}
   	n1=N2;n2=N1;

   				
	}
	
	void inkkey(){
		key[7]++;
		
		Ekey[7]=key[7];
		Ekey[8]=key[7];
		Ekey[16]=key[7];
		Ekey[24]=key[7];
	}
						
};


class CryptData{
	public:
	unsigned long key[8];
	unsigned long tab[8][16];
	
	CryptData(){
	// set tabel mixin			
	
   ulong b0[16]={0x2,0xE,0x9,0x5,0x7,0x6,0x4,0xA,0x0,0xB,0x8,0xD,0x3,0x1,0xF,0xC}; 
   ulong b1[16]={0xA,0xB,0xE,0x3,0x4,0xD,0x7,0x1,0x6,0x5,0x2,0x8,0x0,0xF,0x9,0xC}; 
   ulong b2[16]={0x3,0xA,0x2,0xC,0x8,0xE,0xF,0x4,0x5,0x6,0xD,0x0,0x9,0xB,0x1,0x7}; 
   ulong b3[16]={0xB,0xE,0xC,0x4,0x7,0x6,0xF,0x9,0x3,0x8,0x5,0xD,0x2,0x1,0x0,0xA}; 
   ulong b4[16]={0xC,0xF,0xA,0x8,0x2,0x9,0x7,0x6,0x3,0x4,0xE,0x5,0x1,0xB,0xD,0x0}; 
   ulong b5[16]={0x8,0x6,0x2,0x5,0x3,0xA,0x4,0x7,0xD,0x1,0x9,0xB,0xC,0xE,0x0,0xF}; 
   ulong b6[16]={0x3,0xF,0xA,0xE,0x6,0x2,0x4,0xD,0x1,0x0,0x9,0x7,0xB,0xC,0x5,0x8}; 
   ulong b7[16]={0x2,0x9,0xE,0x4,0x7,0xB,0x1,0x0,0x8,0x3,0xD,0xA,0xF,0xC,0x5,0x6};
   
   for(int i=0;i<16;i++){
	   tab[0][i]=b0[i];tab[1][i]=b1[i];tab[2][i]=b2[i];tab[3][i]=b3[i];
	   tab[4][i]=b4[i];tab[5][i]=b5[i];tab[6][i]=b6[i];tab[7][i]=b7[i];
	}	

	// set key
	
//	ulong k[8]={0xF940A20C,0xF5FE5211,0x17E8D02E,0x6390ED97,
//					0x936A448D,0x7C85DF99,0xAD763ABC,0x3A962C89};
	ulong B[8]={0xADB07FC0,
					0x21AF07A4,
					0x0C81FF39,
					0x0663773F,
					0x6FDF86D1,
					0xA70F2AAE,
					0x11DF841E,
					0x2AEC1682,
				};				
	for(int i=0;i<8;i++)
		key[i]=B[i];				
}
		
	
};


void CharToLong(unsigned char* c,ulong *x){
	
	x[0]=0;
	x[0]=c[3];
	x[0]=(x[0]<<8)|c[2];
	x[0]=(x[0]<<8)|c[1];
	x[0]=(x[0]<<8)|c[0];
	
	x[1]=0;
	x[1]=c[7];
	x[1]=(x[1]<<8)|c[6];
	x[1]=(x[1]<<8)|c[5];
	x[1]=(x[1]<<8)|c[4];
}

void LongToChar(ulong *l,unsigned char *c){
	c[0]=(l[0])& 	 0x000000ff;
	c[1]=(l[0]>>8) &0x000000ff;
	c[2]=(l[0]>>16)&0x000000ff;
	c[3]=(l[0]>>24)&0x000000ff;
	c[4]=(l[1])& 	 0x000000ff;
	c[5]=(l[1]>>8) &0x000000ff;
	c[6]=(l[1]>>16)&0x000000ff;
	c[7]=(l[1]>>24)&0x000000ff;	
}


void fileencode(char *inf,char *outf){
	cout<<"encodin  <<<"<<'\015';
	
	CryptData cd;
	
	Ecrypt crypt;
	crypt.Einit(cd.key,cd.tab);
	crypt.E();
	
	
	ulong *x =new ulong[2];
	unsigned char *c = new unsigned char[8];
	
	fstream in(inf,ios::in    | ios::binary);
	fstream out(outf,ios::out | ios::binary);
	
	if(!in|!out){
		cout<<"ferr"<<endl;
		return;
	}

	
	int m;
	while(1){
		in.read(c,8);
		m=in.gcount();
		if(m==8){
			CharToLong(c,x);
			crypt.Eblock(x[0],x[1]);
			LongToChar(x,c);
			out.write(c,8);
		}
		else{
			out.write(x,m);
			break;
		}
	}
	
	in.close();
	out.close();
}

void filedecode(char *inf,char *outf){
	cout<<"decodin  >>>"<<'\015';
	
	CryptData cd;
	
	Ecrypt crypt;
	crypt.Einit(cd.key,cd.tab);
	crypt.D();
	
	
	ulong *x =new ulong[2];
	unsigned char *c = new unsigned char[8];
	
	fstream in(inf,ios::in    | ios::binary);
	fstream out(outf,ios::out | ios::binary);
	
	int m;
	while(1){
		in.read(c,8);
		m=in.gcount();
		if(m==8){
			CharToLong(c,x);
			crypt.Eblock(x[0],x[1]);
			LongToChar(x,c);
			out.write(c,8);
		}
		else{
			out.write(c,m);
			break;
		}
	}
	
	in.close();
	out.close();
}


void brot(char *inf,char *outf){
	CryptData cd;
	
	
	Ecrypt crypt;
	crypt.Einit(cd.key,cd.tab);
	crypt.D();
	
	
	ulong *x =new ulong[2];
	unsigned char *c = new unsigned char[8];
	
	fstream in(inf,ios::in    | ios::binary);
	fstream out(outf,ios::out | ios::binary);
	
	if(!in|!out){
		cout<<"ferr"<<endl;
		return;
	}	
	
	int readcount=0;
	while(1){
		readcount+=8;
		in.read(c,8);	
		CharToLong(c,x);
		if(readcount>2256080){
			cout<<x[0]<<' '<<x[1]<<' '<<readcount<<endl<<endl;
			break;
		}
	}
	ulong cheack[2];
	cheack[0]=x[0];
	cheack[1]=x[1];
	
	
	unsigned long a=0;
	int count=0;
	while(a<=0xFFFFFFFF){
		crypt.Eblock(x[0],x[1]);
		
		if((x[0])==x[1]){
			count++;
			cout<<endl;
			cout<<crypt.key[7]<<' '<<x[0]<<endl;
			cout<<endl;
		}
		
//		if(a%100000==0){
//			cout<<(a*100.0/0xffffffff)<<' '<<crypt.key[7]<<'\015';
//		}
			
		crypt.inkkey();
		x[0]=cheack[0];
		x[1]=cheack[1];
		a++;

//		break;
	}
	
	cout<<endl<<count<<' ';
	
	in.close();
	out.close();
}

void Ghost(){
	int a,b,c;
	a=7;b=3;
	long time;
	long p1=40;
	long p2=400;	
	for(int k=0;k<30;k++)
	for(int j=0;j<16;j++){
		time=clock();
		while(1){
			c=a/b;
			if((clock()-time)>p1)
				break;
		}	
		switch(j){
		case 0 :		cout<<"(c) G(h)ost 1.2"<<'\015'; break;
		case 1 :		cout<<"*c) G(h)ost 1.2"<<'\015'; break;
		case 2 :		cout<<"(*) G(h)ost 1.2"<<'\015'; break;
		case 3 :		cout<<"(c* G(h)ost 1.2"<<'\015'; break;
		case 4 :		cout<<"(c) *(h)ost 1.2"<<'\015'; break;
		case 5 :		cout<<"(c) G*h)ost 1.2"<<'\015'; break;
		case 6 :		cout<<"(c) G(*)ost 1.2"<<'\015'; break;
		case 7 :		cout<<"(c) G(h*ost 1.2"<<'\015'; break;
		case 8 :		cout<<"(c) G(h)*st 1.2"<<'\015'; break;
		case 9 :		cout<<"(c) G(h)o*t 1.2"<<'\015'; break;
		case 10:		cout<<"(c) G(h)os* 1.2"<<'\015'; break;
		case 11:		cout<<"(c) G(h)ost 1.2"<<'\015'; break;
		case 12:		cout<<"(c) G(h)ost *.2"<<'\015'; break;
		case 13:		cout<<"(c) G(h)ost 1*2"<<'\015'; break;
		case 14:		cout<<"(c) G(h)ost 1.*"<<'\015'; break;		
		default: 
			cout<<"(c) G(h)ost 1.2"<<'\015';	
			time=clock();
			while(1){
				c=a/b;
				if((clock()-time)>p2)
				break;
			};
		}
				
	}
	cout<<"(c) G(h)ost 1.2"<<endl;
	
	char ch;
	cin>>ch;	
}


int main(){
	
//	brot("10","x");
//	fileencode("Victory.mp3","secret");
	filedecode("10","muz.mp3");

	Ghost();
	return 0;
}
Соседние файлы в папке 10gost