C语言实现DES加密解密算法

#include
int asciim[8],m_16[16],m[64],asciik[8],k_16[16],k[64],m_ip[64],l[32],r[32],k_pc1[56],c[28],d[28],cd[56],k_pc2[48],re[48],sh[32],tempr[32],m0[64],m00[64],res[8];
int type;
int ip[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};
int ip_1[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};
int pc_1[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};
int pc_2[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,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32};
int exe[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};
int p[32]={16,7,20,21,29,12,28,17,
1,15,23,26,5,18,31,10,
2,8,24,14,32,27,3,9,
19,13,30,6,22,11,4,25};
int s[8][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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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}},
{{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 print(int *jg,int a,int b)// 输出函数,第一个参数是要输出的数组,第

二个参数数组的长度,第三个参数是每行数的个数
{
int i;
for(i=0;i{
if(i%b==0)
{
printf("\n");
}
printf("%d",jg[i]);
}
return 1;
}
int ascii_to_erjinzhi(int *ascii,int *jg)//这是将8位的ascii矩阵转换成为64位二进制的jg矩阵
{
int i,j,tempb;
for(i=0,j=7;i<8;i++)
{

tempb=(int) ascii[i];
while(tempb>1)
{
jg[j]=(int) (tempb%2);
tempb=(int) (tempb/2);
j--;
}
switch(tempb)
{
case 0:
jg[j]=0;
break;
case 1:
jg[j]=1;
break;
}
while(j%8!=0)
{
j--;
jg[j]=0;
}
j=(i+1)*8+7;
}
return 1;
}
int input_16(int *ja,int *jb,int *jc)//以16进制的形式输入,ja是16进制的矩阵,jb是16进制矩阵转换成8位的十进制矩阵,
//jc是再将它转换成64位的二进制矩阵
{
int i,j;
for(i=0;i<16;i++)
{
ja[i]=getchar();
if(ja[i]==' '||ja[i]=='\n')
{
i--;
}
}
for(i=0;i<16;i++)
{
if(i%2==0&&i!=0)
{
printf("H ");
}
printf("%c",ja[i]);
}
for(i=0;i<16;i++)
{
if(ja[i]<='9')
{
ja[i]=ja[i]-48;
}
else if(ja[i]>='A'&&ja[i]<='F')
{
ja[i]=ja[i]-55;
}
else
{
ja[i]=ja[i]-87;
}
}
for(i=0,j=0;i<8;i++,j=j+2)
{
jb[i]=ja[j]*16+ja[j+1];
}
ascii_to_erjinzhi(jb,jc);
//printf("\n二进制表示是:");
//print(jc,64,8);
return 1;
}
int shuziinput(int *ja,int *jb)//以ascii码的数字的形式输入
{
int i;
for(i=0;i<8;i++)
{
scanf("%d",&ja[i]);
}
ascii_to_erjinzhi(ja,jb);
return 1;

}
int zifuinput(int *ja,int *jb)//以ascii码的字符形式输入
{
int i;
for(i=0;i<8;i++)
{
ja[i]=getchar();
if(ja[i]==' '||ja[i]=='\n')//如果没有换行符在密钥输入的时候密钥初始值就是10
{ //如果写的是换行时break是那么密钥不能输入,直接出结果。如果先调用密钥输入明文直接出结果
i--;
}
else
{
continue;
}
}
for(i=0;i<8;i++)
{
printf("%d ",ja[i]);
}
ascii_to_erjinzhi(ja,jb);
// printf("\n二进制表示是:");
// print(jb,64,8);
getchar();
return 1;
}
int input(int signal)//输入明文或者密文函数
{
printf("请选择输入方式 (ASCII码字符形式输入1,ASCII码数字形式输入2,十六进制形式输入3)");
scanf("%d",&type);
if(signal==1)
{
printf("请输入明文:\n");
}
else if(signal==2)
{
printf("请输入密文:\n");
}
if(type==1)
{
zifuinput(asciim,m);
}
else if(type==2)
{
shuziinput(asciim,m);
//printf("chenggong");
}
else
{
input_16(m_16,asciim,m);
}
return 1;
}
int miyaoinput()//密钥的输入
{
printf("\n请输入密钥:\n");
if(type==1)
{
zifuinput(asciik,k);
}
else if(type==2)
{
shuziinput(asciik,k);
}
else
{
input_16(k_16,asciik,k);
}
return 1;
}
int ipzhihuan()//IP置换
{
int i,j;
for(i=0;i<64;i++)
{
j=(ip[i]-1);
m_ip[i]=m[j];
}
// pr

intf("\nIP置换后:");
// print(m_ip,64,8);
return 1;
}
int ipnizhihuan()//IP逆置换
{
int i,j;
//print(m0,64,8);
for(i=0;i<64;i++)
{
j=(ip_1[i]-1);
m00[i]=m0[j];
}
// printf("\n nizhihuanhou\n");
// print(m00,64,8);
return 1;
}
int pc1zhihuan()//PC1置换
{
int i,j;
for(i=0;i<56;i++)
{
j=(pc_1[i]-1);
k_pc1[i]=k[j];
}
// printf("\npc_1置换后的结果是:");
// print(k_pc1,56,7);
return 1;
}
int pc2zhihuan(int *ja,int *jb)//PC2置换
{
int i,j;
for(i=0;i<48;i++)
{
j=(pc_2[i]-1);
jb[i]=ja[j];
}
// printf("\npc_2置换后的结果是:");
// print(jb,48,6);
return 1;
}
int pzhihuan(int *ja,int *jb)//P置换
{
int i,j;
for(i=0;i<32;i++)
{
j=(p[i]-1);
jb[i]=ja[j];
}
//printf("\np置换后的结果是:");
// print(jb,32,8);
return 1;
}

int initlr(int *ja)//初始化l和r
{
int i;
for(i=0;i<32;i++)
{
l[i]=ja[i];
}
for(i=32;i<64;i++)
{
r[i-32]=ja[i];
}
//printf("\nl是:");
// print(l,32,8);
// printf("\nr是:");
// print(r,32,8);
return 1;
}
int initcd(int *ja)//初始化C D
{
int i;
for(i=0;i<28;i++)
{
c[i]=ja[i];
}
for(i=28;i<56;i++)
{
d[i-28]=ja[i];
}
//printf("\nc是:");
/////print(c,28,7);
//printf("\nd是:");
//print(d,28,7);
return 1;
}
int zuoyi1(int *ja)//以下都是左移
{
int i,temp[28];
//printf("\n左移一位前的结果:");
// print(ja,28,7);
temp[27]=ja[0];
for(i=1;i<28;i++)
{
temp[i-1]=ja[i];
}
for(i=0;i<28;i++)
{
ja[i]=temp[i];
}
//printf("\n左移一位后的结果:");
// print(ja,28,7);
return 1;
}
int youyi1(int *ja)
{
int i,temp[28];
//printf("\n右移一位之前:\n");
//print(ja,28,7);
temp[0]=ja[27];
for(i=1;i<28;i++)
{
temp[i]=ja[i-1];
}
for(i=0;i<28;i++)
{
ja[i]=temp[i];
}
//printf("\n右移一位后的结果:");
//print(ja,28,7);
return 1;
}
int zuoyi2(int *ja)
{
int i,temp[28];
//printf("\n左移两位前的结果:");
//print(ja,28,7);
temp[26]=ja[0];
temp[27]=ja[1];
for(i=0;i<26;i++)
{
temp[i]=ja[i+2];
}
for(i=0;i<28;i++)
{
ja[i]=temp[i];
}
//printf("\n左移两位后的结果:");
//print(ja,28,7);
return 1;
}
int youyi2(int *ja)
{
int i,temp[28];
//printf("\n右移两位前的结果:");
//print(ja,28,7);
temp[0]=ja[26];
temp[1]=ja[27];
for(i=2;i<28;i++)
{
temp[i]=ja[i-2];
}
for(i=0;i<28;i++)
{
ja[i]=temp[i];
}
//printf("\n右移两位后的结果:");
//print(ja,28,7);
return 1;
}
int exetent(int *ja,int *jb)//E膨胀
{
int i,k;
for(i=0;i<48;i++)
{
k=(exe[i]-1);
jb[i]=ja[k];
}
// printf("\nE膨胀后的结果是:");
//print(jb,48,6);
return 1;
}
int yihuo48(int *ja,int *jb)//48位异或
{
int i;
for(i=0;i<48;i++)
{
ja[i]=(ja[i]^jb[i]);
}
// printf("\n异或后的结果是:");
//print(ja,48,6);
return 1;
}
int yihuo32(int *ja,int *jb)
{
int i;
for(i=0;i<32;i++)
{
ja[i]=(ja[

i]^jb[i]);
}
// printf("\n异或后的结果是:");
//print(ja,32,8);
return 1;
}
int shzhihuan(int *ja,int *jb)//S盒置换
{
int i,j,a,b,temp;
for(j=0;j<8;j++)
{
i=j*6;
a=ja[i]*2+ja[i+5]*1;
b=ja[i+1]*8+ja[i+2]*4+ja[i+3]*2+ja[i+4]*1;
temp=s[j][a][b];
i=j*4+3;
while(temp>1)
{
jb[i]=(int) (temp%2);
temp=(int) (temp/2);
i--;
}
switch(temp)
{
case 0:
jb[i]=0;
break;
case 1:
jb[i]=1;
break;
}
while(i%4!=0)
{
i--;
jb[i]=0;
}
}
//printf("\n经过s盒置换后结果是:");
//print(jb,32,8);
return 1;
}
int zuhecd(int *ja,int *jb)//将C D组合
{
int i;
for(i=0;i<28;i++)
{
cd[i]=ja[i];
cd[i+28]=jb[i];
}
//print(cd,56,7);
return 1;
}
int zhuanhuan(int *ja,int *jb)//将32位的jb赋值给ja
{
int i;
for(i=0;i<32;i++)
{
ja[i]=jb[i];
}
return 1;
}
int zuhe64(int *ja,int *jb,int *jc)
{
int i;
for(i=0;i<32;i++)
{
jc[i]=ja[i];
jc[i+32]=jb[i];
}
return 1;
}
int erjinzhi_to_ascii(int *jz,int *jg)//二进制转换成ASCII码
{
int i,j;
for(i=0;i<8;i++)
{
j=i*8;
jg[i]=(jz[j]*128+jz[j+1]*64+jz[j+2]*32+jz[j+3]*16+jz[j+4]*8+jz[j+5]*4+jz[j+6]*2+jz[j+7]*1);
}
return 1;
}
int main()
{

int i,signal;
printf("DES 加密与解密 \t (加密输入1,解密输入2)\n");
scanf("%d",&signal);
input(signal);
miyaoinput();
ipzhihuan();
initlr(m_ip);
pc1zhihuan();
initcd(k_pc1);
for(i=0;i<16;i++)
{
if(i>0)
{
initcd(cd);
}
if(signal==1)
{
if(i==0||i==1||i==8||i==15)
{
zuoyi1(c);
zuoyi1(d);
}
else
{
zuoyi2(c);
zuoyi2(d);
}
}
else if(signal==2)
{
if(i==1||i==8||i==15)
{
youyi1(c);
youyi1(d);
}
else if(i==0)
{
zuhecd(c,d);
pc2zhihuan(cd,k_pc2);
zhuanhuan(tempr,r);
exetent(r,re);
yihuo48(re,k_pc2);
shzhihuan(re,sh);
pzhihuan(sh,r);
yihuo32(r,l);
zhuanhuan(l,tempr);
continue;
}
else
{
youyi2(c);
youyi2(d);
}
}
zuhecd(c,d);
pc2zhihuan(cd,k_pc2);
zhuanhuan(tempr,r);
exetent(r,re);
yihuo48(re,k_pc2);
shzhihuan(re,sh);
pzhihuan(sh,r);
yihuo32(r,l);
zhuanhuan(l,tempr);
}
zhuanhuan(tempr,l);
zhuanhuan(l,r);
zhuanhuan(r,tempr);
zuhe64(l,r,m0);
ipnizhihuan();
erjinzhi_to_ascii(m00,res);
printf("\n结果是:\n");
for(i=0;i<8;i++)
{
printf("%d ",res[i]);
}
printf("\n");
for(i=0;i<8;i++)
{
printf("%c ",res[i]);
}
return 1;
}

相关主题
相关文档
最新文档