• 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)
• {
Dostları ilə paylaş: |