key|=temp;//compare
returnkey;
}
/*Dividebitsintotwoparts*/
inlinevoiddivide(bit64num,intlen,bit32*L,bit32*R)
{
*L=*R=0;
*L=num&MAX32;
num>>=len;
*R=num&MAX32;
}
/*Sbox*/
inlinebit32SChange(bit48num)
{
bit32key=0;
for(inti=0;i<8;i++)
{
bit32x,y;
x=(num>>1)&0x0F;//themiddlefourbits
y=(((num>>5)&1)<<1)|(num&1);//thefirstandthelastbits
key|=(S[i][y][x]<<(i*4));//permutate
num>>=6;//changetonext
}
returnkey;
}
/*Fbox*/
inlinebit32FChange(bit32num,bit48key)
{
bit48temp=substitute(num,E,sizeof(E)/sizeof(E[0]));
temp^=key;
num=SChange(temp);
returnsubstitute(num,P,sizeof(P)/sizeof(P[0]));
}
/*Keyinitialization*/
inlinevoidSetKey(char*in)
{
bit64key=ToBit(in);
bit28C,D;
key=substitute(key,PC1,sizeof(PC1)/sizeof(PC1[0]));
divide(key,28,&C,&D);
for(inti=0;i<16;i++)
{
C=MoveLeft(C,Move[i]);
D=MoveLeft(D,Move[i]);
key=(bit64)C|((bit64)D<<28);
SubKey[i]=substitute(key,PC2,48);
}
}
/*Enryption*/
inlinevoidDES(char*message)
{
bit64BitMes=substitute(ToBit(message),IP,sizeof(IP)/sizeof(IP[0]));
bit32L,R,temp;
divide(BitMes,32,&L,&R);
/*16rounds*/
for(inti=0;i<16;i++)
{
temp=R;
R=FChange(R,SubKey[i]);
R^=L;
L=temp;
}
BitMes=(bit64)L|((bit64)R<<32);
BitMes=substitute(BitMes,IPR,sizeof(IPR)/sizeof(IPR[0]));
/*printencryptedmessage*/
for(inti=0;i<16;i++)
{
chartemp=(0xF&(BitMes>>(i*4)));
temp+=(temp>9?
'7':
'0');
printf("%c",temp);
}
}
/*Deciphering*/
inlinevoidDecipher(char*message)
{
bit64BitMes=substitute(DeToBit(message),IP,sizeof(IP)/sizeof(IP[0]));
bit32L,R,temp;
divide(BitMes,32,&L,&R);
/*16rounds*/
for(inti=15;i>=0;i--)
{
temp=L;
L=FChange(L,SubKey[i]);
L^=R;
R=temp;
}
BitMes=(bit64)L|((bit64)R<<32);
BitMes=substitute(BitMes,IPR,sizeof(IPR)/sizeof(IPR[0]));
/*printdecipheredmessages*/
for(inti=0;i<8;i++)
{
printf("%c",(0xFF&(BitMes>>(i*8))));
}
}
table.h文件
#pragmaonce
/*IPpermutationforplaintext*/
constintIP[64]={
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7
};
/*IPRpermutationtoprint*/
constintIPR[64]={
40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25
};
/*---------------------------premutation----------------------------*/
/*theexpansionpermutation*/
staticintE[48]={
32,1,2,3,4,5,4,5,6,7,8,9,
8,9,10,11,12,13,12,13,14,15,16,17,
16,17,18,19,20,21,20,21,22,23,24,25,
24,25,26,27,28,29,28,29,30,31,32,1
};
/*Compressionpermutation*/
staticintPC1[56]={
57,49,41,33,25,17,9,1,58,50,42,34,26,18,
10,2,59,51,43,35,27,19,11,3,60,52,44,36,
63,55,47,39,31,23,15,7,62,54,46,38,30,22,
14,6,61,53,45,37,29,21,13,5,28,20,12,4
};
/*Numberofkeybitsshiftedperround*/
staticintMove[16]={
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
/*Compressionpermutation*/
staticintPC2[48]={
14,17,11,24,1,5,3,28,15,6,21,10,
23,19,12,4,26,8,16,7,27,20,13,2,
41,52,31,37,47,55,30,40,51,34,33,48,
44,49,39,56,34,53,46,42,50,36,29,32
};
/*-------------Ffunction---------------*/
/*Sboxespermutation*/
staticintS[8][4][16]={
//S1
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,
//S2
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,
//S3
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,
//S4
7,13,14,3,0,6,9