Code:/* Hey guys, I actually rewritten the code originally posted by AbhishekDwivedi to make it more readable. Plus, I have also rewritten the array initialization for arrays s1, s2, etc... for, well, readability purposes. I have also removed the function declaration for sbox, sl, rh, row, bindec and p1 inside the main() block (otherwise, it will generate compile-time error). instead i put it outside, which is how we would normally declare our function prototypes. NOTE: I have found out also that in the original code especially in the array initialization for s2, the author has somehow committed an error. Look at the code snippet s2[0][0]=5; s2[0][1]=1; s2[0][2]=8; s2[0][3]=14; s2[0][4]=6; s1[0][5]=11; /* THIS LINE IS ERRONEOUS!!! IT SHOULD BE s2[0][5]=11; */ s2[0][6]=3; I haven't started analyzing the code yet. Maybe we can start from here. */ #include<stdio.h> #include<conio.h> int s1[4][16],s2[4][16],s3[4][16],s4[4][16],s5[4][16],s6[4][16],s7[4][16],s8[4][16]; int k[56],k1[64],k2[56],k3[48]; int bl[32], br[32]; int b1[64], b2[64], b3[48]; int s[48], t[48]; int br1[32], br2[32]; int i; int count=0; int n; int r=1; int sbox(int,int,int,int); void sl(); void rh(); int row(int,int); void bindec(int); void p1(); void main() { int snum[8],btemp[32], i; int sr1,sr2,sr3,sr4,sr5,sr6,sr7,sr8,sc1,sc2,sc3,sc4,sc5,sc6,sc7,sc8; clrscr(); static int s1[][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 }; static int s2[][16]={ 5, 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 }; static int s3[][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 }; static int s4[][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 }; static int s5[][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 }; static int s6[][16]={ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 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 }; static int s7[][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, 12, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 }; static int s8[][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 }; printf("Enter 64-bit binary data "); for( i=0;i<64;i++){ g: scanf("%d",&b1[i]); if(b1[i]>1||b1[i]<0){ printf("Enter binary data only : "); goto g; } } printf("Enter the 56-bit key\n[Key length is 64 bits,but 8 are\nreserved for parity checking "); for(i=0;i<56;i++) { g1: scanf("%d",&k[i]); if(k[i]>1||k[i]<0){ printf("Enter binary data only : "); goto g1; } } for(i=0;i<64;i++) b2[i]=b1[i]; / * Initial permutation of data. */ b1[0]=b2[57]; b1[1]=b2[49]; b1[2]=b2[41]; b1[3]=b2[33]; b1[4]=b2[25]; b1[5]=b2[17]; b1[6]=b2[9]; b1[7]=b2[1]; b1[8]=b2[59]; b1[9]=b2[51]; b1[10]=b2[43]; b1[11]=b2[35]; b1[12]=b2[27]; b1[13]=b2[19]; b1[14]=b2[11]; b1[15]=b2[3]; b1[16]=b2[61]; b1[17]=b2[53]; b1[18]=b2[45]; b1[19]=b2[37]; b1[20]=b2[29]; b1[21]=b2[21]; b1[22]=b2[13]; b1[23]=b2[5]; b1[24]=b2[63]; b1[25]=b2[55]; b1[26]=b2[47]; b1[27]=b2[39]; b1[28]=b2[31]; b1[29]=b2[23]; b1[30]=b2[15]; b1[31]=b2[7]; b1[32]=b2[56]; b1[33]=b2[48]; b1[34]=b2[40]; b1[35]=b2[32]; b1[36]=b2[24]; b1[37]=b2[16]; b1[38]=b2[8]; b1[39]=b2[0]; b1[40]=b2[58]; b1[41]=b2[50]; b1[42]=b2[42]; b1[43]=b2[34]; b1[44]=b2[26]; b1[45]=b2[18]; b1[46]=b2[10]; b1[47]=b2[2]; b1[48]=b2[60]; b1[49]=b2[52]; b1[50]=b2[44]; b1[51]=b2[36]; b1[52]=b2[28]; b1[53]=b2[20]; b1[54]=b2[12]; b1[55]=b2[4]; b1[56]=b2[62]; b1[57]=b2[54]; b1[58]=b2[46]; b1[59]=b2[38]; b1[60]=b2[30]; b1[61]=b2[22]; b1[62]=b2[14]; b1[63]=b2[6]; for(i=0;i<56;i++) k1[i]=k[i]; /* Converting 64-bit key to 56-bit key. */ k2[0]=k1[57]; k2[1]=k1[49]; k2[2]=k1[41]; k2[3]=k1[33]; k2[4]=k1[25]; k2[5]=k1[17]; k2[6]=k1[9]; k2[7]=k1[1]; k2[8]=k1[58]; k2[9]=k1[50]; k2[10]=k1[42]; k2[11]=k1[34]; k2[12]=k1[26]; k2[13]=k1[18]; k2[14]=k1[10]; k2[15]=k1[2]; k2[16]=k1[59]; k2[17]=k1[51]; k2[18]=k1[43]; k2[19]=k1[35]; k2[20]=k1[27]; k2[21]=k1[19]; k2[22]=k1[11]; k2[23]=k1[3]; k2[24]=k1[60]; k2[25]=k1[52]; k2[26]=k1[44]; k2[27]=k1[36]; k2[28]=k1[63]; k2[29]=k1[55]; k2[30]=k1[47]; k2[31]=k1[39]; k2[32]=k1[31]; k2[33]=k1[23]; k2[34]=k1[15]; k2[35]=k1[7]; k2[36]=k1[62]; k2[37]=k1[54]; k2[38]=k1[46]; k2[39]=k1[38]; k2[40]=k1[30]; k2[41]=k1[22]; k2[42]=k1[14]; k2[43]=k1[6]; k2[44]=k1[61]; k2[45]=k1[53]; k2[46]=k1[45]; k2[47]=k1[37]; k2[48]=k1[29]; k2[49]=k1[21]; k2[50]=k1[13]; k2[51]=k1[5]; k2[52]=k1[28]; k2[53]=k1[20]; k2[54]=k1[12]; k2[55]=k1[4]; for(i=0;i<32;i++) /* Breaking the initially permuted */ bl[i]=b1[i]; /* data bits in right-half */ for(i=32;i<64;i++) /* and left-half respectively */ br[i-32]=b1[i]; for(r=1;r<=16;r++) { rh(); sl(); printf("Round %d :\n",r); for(i=0;i<56;i++) printf("%d ",k3[i]); for(i=0;i<48;i++){ s[i]=b3[i]+k3[i]; /* X-OR of Expanded Right-side of data and compressed */ if(s[i]==2) /* key. */ s[i]=0; } for(i=0;i<48;i++) t[i]=s[i]; printf("\n\n"); getch(); sr1=row(t[0],t[5]); sr2=row(t[6],t[11]); sr3=row(t[12],t[17]); sr4=row(t[18],t[23]); sr5=row(t[24],t[29]); sr6=row(t[30],t[35]); sr7=row(t[36],t[41]); sr8=row(t[42],t[47]); sc1=sbox(1,2,3,4); sc2=sbox(7,8,9,10); sc3=sbox(13,14,15,16); sc4=sbox(19,20,21,22); sc5=sbox(25,26,27,28); sc6=sbox(31,32,33,34); sc7=sbox(37,38,39,40); sc8=sbox(43,44,45,46); snum[0]=s1[sr1][sc1]; snum[1]=s2[sr2][sc2]; snum[2]=s3[sr3][sc3]; snum[3]=s4[sr4][sc4]; snum[4]=s5[sr5][sc5]; snum[5]=s6[sr6][sc6]; snum[6]=s7[sr7][sc7]; snum[7]=s8[sr8][sc8]; bindec(snum[0]); bindec(snum[1]); bindec(snum[2]); bindec(snum[3]); bindec(snum[4]); bindec(snum[5]); bindec(snum[6]); bindec(snum[7]); p1(); for(i=0;i<32;i++) { btemp[i]=bl[i]+br1[i]; if(btemp[i]==2) btemp[i]=0; } for(i=0;i<32;i++) bl[i]=br[i]; for(i=0;i<32;i++) br[i]=btemp[i]; count=0; }/* end for block */ for(i=0;i<32;i++) b1[i]=bl[i]; for(i=0;i<32;i++) b1[i+32]=br[i]; for(i=0;i<64;i++) b2[i]=b1[i]; /* Final permutation to obtain ciphertext */ b1[0]=b2[40]; b1[1]=b2[8]; b1[2]=b2[48]; b1[3]=b2[16]; b1[4]=b2[56]; b1[5]=b2[24]; b1[6]=b2[64]; b1[7]=b2[32]; b1[8]=b2[39]; b1[9]=b2[7]; b1[10]=b2[47]; b1[11]=b2[15]; b1[12]=b2[55]; b1[13]=b2[23]; b1[14]=b2[63]; b1[15]=b2[31]; b1[16]=b2[38]; b1[17]=b2[6]; b1[18]=b2[46]; b1[19]=b2[14]; b1[20]=b2[54]; b1[21]=b2[22]; b1[22]=b2[62]; b1[23]=b2[30]; b1[24]=b2[37]; b1[25]=b2[5]; b1[26]=b2[45]; b1[27]=b2[13]; b1[28]=b2[53]; b1[29]=b2[21]; b1[30]=b2[61]; b1[31]=b2[29]; b1[32]=b2[36]; b1[33]=b2[4]; b1[34]=b2[44]; b1[35]=b2[12]; b1[36]=b2[52]; b1[37]=b2[20]; b1[38]=b2[60]; b1[39]=b2[28]; b1[40]=b2[35]; b1[41]=b2[3]; b1[42]=b2[43]; b1[43]=b2[11]; b1[44]=b2[51]; b1[45]=b2[19]; b1[46]=b2[59]; b1[47]=b2[27]; b1[48]=b2[34]; b1[49]=b2[2]; b1[50]=b2[42]; b1[51]=b2[10]; b1[52]=b2[50]; b1[53]=b2[18]; b1[54]=b2[58]; b1[55]=b2[26]; b1[56]=b2[33]; b1[57]=b2[1]; b1[58]=b2[41]; b1[59]=b2[9]; b1[60]=b2[49]; b1[61]=b2[17]; b1[62]=b2[57]; b1[63]=b2[25]; printf("\n\n"); for(i=0;i<32;i++) printf("%d ",bl[i]); printf("\n"); for(i=0;i<32;i++) printf("%d ",br[i]); printf("\n\n***********\n"); printf("The encrypted 64-bit data is as follows :\n"); for(i=0;i<64;i++) printf("%d ",b1[i]); getch(); } /* end of main block */ void rh() { /* Expansion permutation of Right-half of data. */ b3[0]=br[31]; b3[1]=br[0]; b3[2]=br[1]; b3[3]=br[2]; b3[4]=br[3]; b3[5]=br[4]; b3[6]=br[3]; b3[7]=br[4]; b3[8]=br[5]; b3[9]=br[6]; b3[10]=br[7]; b3[11]=br[8]; b3[12]=br[7]; b3[13]=br[8]; b3[14]=br[9]; b3[15]=br[10]; b3[16]=br[11]; b3[17]=br[12]; b3[18]=br[11]; b3[19]=br[12]; b3[20]=br[13]; b3[21]=br[14]; b3[22]=br[15]; b3[23]=br[16]; b3[24]=br[15]; b3[25]=br[16]; b3[26]=br[17]; b3[27]=br[18]; b3[28]=br[19]; b3[29]=br[20]; b3[30]=br[19]; b3[31]=br[20]; b3[32]=br[21]; b3[33]=br[22]; b3[34]=br[23]; b3[35]=br[24]; b3[36]=br[23]; b3[37]=br[24]; b3[38]=br[25]; b3[39]=br[26]; b3[40]=br[27]; b3[41]=br[28]; b3[42]=br[27]; b3[43]=br[28]; b3[44]=br[29]; b3[45]=br[30]; b3[46]=br[31]; b3[47]=br[0]; } /* end of rh block */ void sl() { int temp; temp=k2[0]; for(i=0;i<27;i++) k2[i]=k2[i+1]; k2[27]=temp; if(r==3||r==4||r==5||r==6||r==7||r==8||r==10||r==11||r==12||r==13||r==14||r==15) { temp=k2[0]; for(i=0;i<27;i++) k2[i]=k2[i+1]; k2[27]=temp; } temp=k2[28]; for(i=28;i<55;i++) k2[i]=k2[i+1]; k2[55]=temp; if(r==3||r==4||r==5||r==6||r==7||r==8||r==10||r==11||r==12||r==13||r==14||r==15) { temp=k2[28]; for(i=28;i<55;i++) k2[i]=k2[i+1]; k2[55]=temp; } /* Compression permutation of the key. */ k3[0]=k2[13]; k3[1]=k2[16]; k3[2]=k2[10]; k3[3]=k2[23]; k3[4]=k2[0]; k3[5]=k2[4]; k3[6]=k2[2]; k3[7]=k2[27]; k3[8]=k2[14]; k3[9]=k2[5]; k3[10]=k2[20]; k3[11]=k2[9]; k3[12]=k2[22]; k3[13]=k2[18]; k3[14]=k2[11]; k3[15]=k2[3]; k3[16]=k2[25]; k3[17]=k2[7]; k3[18]=k2[15]; k3[19]=k2[6]; k3[20]=k2[26]; k3[21]=k2[19]; k3[22]=k2[12]; k3[23]=k2[1]; k3[24]=k2[40]; k3[25]=k2[51]; k3[26]=k2[30]; k3[27]=k2[36]; k3[28]=k2[46]; k3[29]=k2[54]; k3[30]=k2[29]; k3[31]=k2[39]; k3[32]=k2[50]; k3[33]=k2[44]; k3[34]=k2[32]; k3[35]=k2[47]; k3[36]=k2[43]; k3[37]=k2[48]; k3[38]=k2[38]; k3[39]=k2[55]; k3[40]=k2[33]; k3[41]=k2[52]; k3[42]=k2[45]; k3[43]=k2[41]; k3[44]=k2[49]; k3[45]=k2[35]; k3[46]=k2[28]; k3[47]=k2[31]; } /* end of s1 block */ int row(int bitl,int bitr) { int rown; /**/ t[bitr]=t[bitr]*1; t[bitl]=t[bitr]*2; rown=t[bitr]+t[bitl]; return(rown); }/* end of row block */ int sbox(int p,int q,int r,int s) { int col; t[s]=t[s]*1; t[r]=t[r]*2; t[q]=t[q]*4; t[p]=t[p]*8; col=t[s]+t[r]+t[q]+t[p]; /**/ return(col); }/* end of sbox block */ void bindec(int dec) { int vrble=3,dec1; while(vrble!=0) { dec1=dec%2; if(dec1==0) { br1[count+vrble]=0; } else { br1[count+vrble]=1; } vrble=vrble-1; dec=dec/2; } count=count+4; } /* end of bindec block */ void p1() { for(i=0;i<32;i++) /* Permutation of 32-bit output of s-boxes */ br2[i]=br1[i]; br1[0]=br2[15]; br1[1]=br2[6]; br1[2]=br2[19]; br1[3]=br2[20]; br1[4]=br2[28]; br1[5]=br2[11]; br1[6]=br2[27]; br1[7]=br2[16]; br1[8]=br2[0]; br1[9]=br2[14]; br1[10]=br2[22]; br1[11]=br2[25]; br1[12]=br2[4]; br1[13]=br2[17]; br1[14]=br2[30]; br1[15]=br2[9]; br1[16]=br2[1]; br1[17]=br2[7]; br1[18]=br2[23]; br1[19]=br2[13]; br1[20]=br2[31]; br1[21]=br2[26]; br1[22]=br2[2]; br1[23]=br2[8]; br1[24]=br2[18]; br1[25]=br2[12]; br1[26]=br2[29]; br1[27]=br2[5]; br1[28]=br2[21]; br1[29]=br2[10]; br1[30]=br2[3]; br1[31]=br2[24]; } /* end of p1 block */




Reply With Quote