Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
// 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;
}