title: • ifO—5) - S. K. Ganiyev
text: • ifO—5)
  • {
  • k=4*i+j;
  • exp[i][j]=right[k-1 ];
  • }
  • }
  • }
  • exp[0][0]=right[31];
  • exp[7][5]=right[0];
  • k=0;
  • for(i=0;i<8;i++)
  • for(j=0;j<6;j++)
  267
  • expansion[k++]=exp[i][j];
  • }
  • void Des::PermChoice2()
  * {
  • int per[56],i,k;
  • for(i=0;i<28;i++) per[i]=ck[i];
  • for(k=0,i=28;i<56;i++) per[i]=dk[k++];
  • z[0]=per[ 13];z[ l]=per[ 16];z[2]=per[ 10];z[3]=per[23];z[4]=p
  er[0] ;z[5]=per[4];z[6]=per[2] ;z[7]=per[27];
  • z[8]=per[14];z[9]=per[5];z[10]=per[20];z[l l]=per[9];z[12]=
  per[22] ;z[ 13]=per[ 18] ;z[ 14]=per[ 1 l];z[l 5]=per[3];
  • z[ 16]=per[25] ;z[ 17]=per[7] ;z[ 18]=per[ 15] ;z[ 19]=per[6] ;z[2
  0]=per[26];z[21 ]=per[ 19];z[22]=per[ 12] ;z[23]=per[ 1 ];
  • z[24]=per[40];z[25]=per[51 ] ;z[26]=per[30] ;z[27]=per[3 6] ;z
  [28]=per[46];z[29]=per[54];z[30]=per[29];z[31]=per[39];
  • z[32]=per[50];z[33]=per[46];z[34]i=per[32];z[35]=per[47];z
  [36]=per[43];z[37]=per[48];z[38]=per[38];z[39]=per[55];
  • z[40]=per[33];z[41 ]=per[52] ;z[42]=per[45];z[43]=per[41 ] ;z
  [44]=per[49] ;z[45]=per[3 5] ;z[46]=per[28];z[47]=per[31 ];
  • }
  • void Des::xor_oneE(int round)//for Encrypt
  • {
  - • int i;
  • for(i=0;i<48;i++)
  • xor 1 [i]=expansion[i]Akeyi[round-1 ] [i];
  • }
  • void Des: :xor_oneD(int round) //for Decrypt
  • {
  • int i;
  • for(i=0;i<48;i++)
  • xor 1 [i]=expansion[i] Akeyi[ 16-round] [i];
  • }
  • void Des::substitution()
  268
  {
  int sl[4][16]={
  14.4.13.1.2.15.11.8.3.10.6.12.5.9.0.7,
  0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
  4.1.14.8.13.6.2.11.15.12.9.7.3.10.5.0,
  15.12.8.2.4.9.1.7.5.11.3.14.10.0.6.13
  };
  int s2[4][16]={
  15.1.8.14.6.11.3.4.9.7.2.13.12.0.5.10,
  3.13.4.7.15.2.8.14.12.0.1.10.6.9.11.5,
  0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
  13.8.10.1.3.15.4.2.11.6.7.12.0.5.14.9
  };
  int s3[4][16]={
  10.0.9.14.6.3.15.5.1.13.12.7.11.4.2.8,
  13.7.0.9.3.4.6.10.2.8.5.14.12.11.15.1,
  13.6.4.9.8.15.3.0.11.1.2.12.5.10.14.7,
  1.10.13.0.6.9.8.7.4.15.14.3.11.5.2.12
  };
  int s4[4][16]={
  7.13.14.3.0.6.9.10.1.2.8.5.11.12.4.15,
  13.8.11.5.6.15.0.3.4.7.2.12.1.10.14.9,
  10.6.9.0.12.11.7.13.15.1.3.14.5.2.8.4,
  3.15.0.6.10.1.13.8.9.4.5.11.12.7.2.14
  };
  int s5[4][16]={
  2.12.4.1.7.10.11.6.8.5.3.15.13.0.14.9,
  14.11.2.12.4.7.13.1.5.0.15.10.3.9.8.6,
  4.2.1.11.10.13.7.8.15.9.12.5.6.3.0.14,
  11.8.12.7.1.14.2.13.6.15.0.9.10.4.5.3
  };
  int s6[4][16]={
  12.1.10.15.9.2.6.8.0.13.3.4.14.7.5.11,
  269
  10.15.4.2.7.12.9.5.6.1.13.14.0.11.3.8,
  9.14.15.5.2.8.12.3.7.0.4.10.1.13.11.6,
  4.3.2.12.9.5.15.10.11.14.1.7.6.0.8.13
  };
  int s7[4][16]={
  4.11.2.14.15.0.8.13.3.12.9.7.5.10.6.1,
  13.0.11.7.4.9.1.10.14.3.5.12.2.15.8.6,
  1.4.11.13.12.3.7.14.10.15.6.8.0.5.9.2,
  6.11.13.8.1.4.10.7.9.5.0.15.14.2.3.12
  };
  int s8[4][16]={
  13.2.8.4.6.15.11.1.10.9.3.14.5.0.12.7,
  1.15.13.8.10.3.7.4.12.5.6.11.0.14.9.2,
  7.11.4.1.9.12.14.2.0.6.10.13.15.3.5.8,
  2.1.14.7.4.10.8.13.15.12.9.0.3.5.6.11
  };
  int a[8][6],k=0,i,j,p,q,count=0,g=0,v;
  for(i=0;i<8;i++)
  {
  for(j=0;j<6;j++)
  {
  a[i][j]=xorl[k++];
  }
  }
  for( i=0;i<8;i++)
  {
  p=l;q=0;
  k=(a[i][0]*2)+(a[i][5]*l);
  j=4;
  while(j>0)
  {
  q=q+(a[i][j]*p);
  P=P*2;
  270
  • j--;
  • }
  • count=i+l;
  • switch(count)
  • {
  • case 1: v=sl[k][q];
  break;
  • case 2: v=s2[k][q];
  break;
  • case 3: v=s3[k][q];
  break;
  • ctfse 4: v=s4[kj[q];
  break;
  • case 5: v=s5[k][q];
  break;
  • case 6: v=s6[k][q];
  break;
  • case 7: v=s7[k][q];
  break;
  • case 8; v=s8[k][q];
  break;
  • }
  • intd,i=3,a[4];
  • while(v>0)
  • {
  • d=v%2;
  • a[i~]=d;
  • v=v/2;
  • }
  • while(i>=0)
  • {
  • a[i—]=0;
  • }
  • for(i=0;i<4;i++)
  • sub[g++]=a[i];
  • }
  •
  }
  • void Des: ;permutation()
  • {
  • p[0]=sub[15];p[l]=sub[6];p[2]=sub[19];p[3]=sub[20j;p[4]
  sub[28};p[5]=sub[ll];p[6]=sub[27];p[7]=sub[16];
  • p[8]=sub[0];p[9]=sub[14];p[10]=sub[22];p[l l]=sub[25];p[l
  2]=sub[4];p[13]=sub[17];p[14]=sub[30];p[15]=sub[9];
  • Pt 16]=sub[ 1 ] ;p[ 17]=sub[7] ;p[ 18]=sub[23];p[ 19]=sub[ 13] ;p[
  20]=sub[31];p[21]=sub[26];p[22]=sub[2];p[23]=sub[8];
  • p[24]=sub[18];p[25]=sub[12];p[26]=sub[29];p[27]=sub[5];p
  [28]=sub[21 ];p[29]=sub[ 10];p[30]=sub[3];p[31 ]=sub[24];
  • }
  • void Des::xor_two()
  • {
  • inti;
  • for(i=0;i<32;i++)
  • {
  • xor2[i]=left[i]Ap[i];
  • }
  • }
  • void Des::inverse()
  • {
  • intp=40,q=8,kl,k2,i,j;
  • for(i=0;i<8;i++)
  • {
  • kl=p;k2=q;
  • for(j=0;j<8;j++)
  • {
  • if(j%2==0)
  • {
  • inv[i][j]=temp[kl-l];
  • kl=kl+8;
  • }
  • else if(j%2!=0)
  • {
  • inv[i][j]=temp[k2-l];
  • k2=k2+8;
  • }
  272
  •
  }
  • p=p-l;q=q-l;
  • }
  • }
  • char * Des::Encrypt(char *Textl)
  • {
  • int i,al,j,nB,m,iB,k,K,B[8],n,t,d,round;
  • char *Text=new char[ 1000];
  • strcpy(Text,Textl);
  • i=strlen(Text);
  • intmc=0;
  • al=i%8;
  • if(al!=0) for(j=0;j<8-al;j++,i++) Text[i]=''; Text[i]='\0';
  • keygen();
  • for(iB=0,nB=0,m=0;m<(strlen(Text)/8);m++) //Repeat for
  TextLenth/8 times.
  • {
  • for(iB=0,i=0;i<8;i++,nB++)
  • {
  • n=(int)Text[nB];
  • for(K=7 ;n>= 1 ;K—)
  • {
  • B[K]=n%2; //Converting 8-Bytes to 64-bit Binary Format
  • n/=2;
  • } for(;K>=0;K-) B[K]=0;
  • for(K=0;K<8;K++,iB++) total[iB]=B[K]; //Now 'total'
  contains the 64-Bit binary format of 8-Bytes
  • }
  • IP(); //Performing initial permutation on 'total[64]'
  • for(i=0;i<64;i++) total[i]=ip[i]; //Store values of ip[64] into
  total[64]
  • for(i=0;i<32;i++) left[i]=total[i]; //
  + -> left[32]
  • // total[64]—|
  273
  • for(;i<64;i++) right[i-32]=total[i];//
  +—> right[32]
  • for(round= 1 ;round<= 16;round++)
  • {
  • Expansion(); //Performing expansion on 'right[32]' to get
  'expansion[48]'
  • xor oneE(round); //Performing XOR operation on
  expansion[48],z[48] to get xor 1 [48]
  • substitution();//Perform substitution on xorl [48] to get
  sub[32]
  • permutation(); //Performing Permutation on sub[32] to get
  P[32]
  • xor_two(); //Performing XOR operation on left[32],p[32] to
  get xor2[32]
  • for(i=0;i<32;i++) left[i]=right[i]; //Dumping right[32] into
  left[32]
  • for(i=0;i<32;i++) right[i]=xor2[i]; //Dumping xor2[32] into
  right[32]
  • }
  • for(i=0;i<32;i++) temp[i]=right[i]; // Dumping -> [
  swap32bit ]
  • for(;i<64;i++) temp[i]=left[i-32]; // left[32],right[32] into
  temp[64]
  • inverse(); //Inversing the bits of temp[64] to get inv[8][8]
  • /* Obtaining the Cypher-Text into final [1000]*/
  • k=128; d=0;
  • for(i=0;i<8;i++)
  • {
  • for(j=0;j<8;j++)
  • {
  • d=d+inv[i][j]*k;
  • k=k/2;
  •
  }
  • fmal[mc++]=(char)d;
  274
  • k=128; d=0;
  •
  }
  • } //for loop ends here
  • fmal[mc]='\0';
  • retum(final);
  • }
  • char * Des::Decrypt(char *Textl)
  • {
  |