📄 (clanguage).txt
字号:
RE0[i]=R0[E[i]-1];
//printf("RE0\n");
//for(i=0;i<48;i++)
//printf("%d,",RE0[i]);
for(i=0;i<48;i++) //RE与K异或运算
RK[i]=RE0[i]^K[t][i];
//printf("\n");
//for(i=0;i<48;i++)
//printf("%d,",RK[i]);
for(i=0;i<8;i++) //将R和K异或运算的结果通过S位移表
{
r[i]=RK[(i*6)+0]*2+RK[(i*6)+5];
c[i]=RK[(i*6)+1]*8+RK[(i*6)+2]*4+RK[(i*6)+3]*2+RK[(i*6)+4];
}
RKS[0]=S1[r[0]][c[0]];
RKS[1]=S2[r[1]][c[1]];
RKS[2]=S3[r[2]][c[2]];
RKS[3]=S4[r[3]][c[3]];
RKS[4]=S5[r[4]][c[4]];
RKS[5]=S6[r[5]][c[5]];
RKS[6]=S7[r[6]][c[6]];
RKS[7]=S8[r[7]][c[7]];
for(i=0;i<8;i++) //把结果转成32位二进制储存在数组SP中
{
int b[4]={0,0,0,0};
m=RKS[i];
for(j=3;m!=0;j--)
{
b[j]=m%2;
m=m/2;
}
for(j=0;j<4;j++)
SP[j+(i*4)]=b[j];
}
for(i=0;i<32;i++) //将二进制结果再经过一个P盒换位
RKSP[i]=SP[P[i]-1];
for(i=0;i<32;i++) //与前一次的左部异或运算,得到本次迭代的右部
Ri[i]=L0[i]^RKSP[i];
for(i=0;i<32;i++)
{
L0[i]=R0[i];
R0[i]=Ri[i];
}
}
//一个左右32位交换
for(i=0;i<32;i++)
Li[i]=R0[i];
for(i=0;i<32;i++)
R0[i]=L0[i];
for(i=0;i<32;i++)
L0[i]=Li[i];
//初始换位的逆过程
for(i=0;i<32;i++) //把左右两部分合起来存到text_end中
text_end[i]=L0[i];
for(i=32;i<64;i++)
text_end[i]=R0[i-32];
for(i=0;i<64;i++) //进行初始换位的逆过程
text_out[l+1][IP[i]-1]=text_end[i];
for(i=0;i<64;i++)
result[l][i]=text_out[l+1][i];
//for(i=0;i<64;i++)
//printf("%d,",result[l][i]);
//printf("\n");
}
for(j=0;j<n;j++) //把result中的二进制密文转成十进制存到数组H中
for(i=0;i<16;i++)
H[i+(j*16)]=result[j][0+(i*4)]*8+result[j][1+(i*4)]*4+result[j][2+(i*4)]*2+result[j][3+(i*4)];
//for(i=0;i<l*16;i++)
//printf("%d,",H[i]);
for(i=0;i<n*16;i++)
{
if(H[i]<10)
MiWen[i]=H[i]+48;
else if(H[i]==10)
MiWen[i]='a';
else if(H[i]==11)
MiWen[i]='b';
else if(H[i]==12)
MiWen[i]='c';
else if(H[i]==13)
MiWen[i]='d';
else if(H[i]==14)
MiWen[i]='e';
else if(H[i]==15)
MiWen[i]='f';
//else MiWen[i]='\0';
}
for(i=l*16;i<224;i++)
MiWen[i]='\0';
printf("您的文件经过DES加密后的密文是:\n");
printf("%s\n",MiWen);
printf("\n\n");
}
//解密程序
else if(choice=='B'||choice=='b')
{
printf("请输入密文内容:\n");
gets(MiWen);
for(i=0;i<208;i++)
H[i]=0;
for(i=0;MiWen[i]!='\0';i++) //将十六进制密文转化成十进制存放在数组H中
{
if(MiWen[i]>='0'&&MiWen[i]<='9')
H[i]=MiWen[i]-'0';
else if(MiWen[i]>='A'&&MiWen[i]<='F')
H[i]=MiWen[i]-'A'+10;
else if(MiWen[i]>='a'&&MiWen[i]<='f')
H[i]=MiWen[i]-'a'+10;
else
{
printf("请输入用十六进制表示的密文内容:\n");
gets(MiWen);
i=0;
}
}
n=i; //密文中共有n个字符
if(n%16!=0)
{
printf("对不起,您输入的密文不正确,请确认密文的内容,密文的字符数应是16的倍数。\n");
printf("请输入密文内容:\n");
gets(MiWen);
for(i=0;i<208;i++)
H[i]=0;
for(i=0;MiWen[i]!='\0';i++) //将十六进制密文转化成十进制存放在数组H中
{
if(MiWen[i]>='0'&&MiWen[i]<='9')
H[i]=MiWen[i]-'0';
else if(MiWen[i]>='A'&&MiWen[i]<='F')
H[i]=MiWen[i]-'A'+10;
else if(MiWen[i]>='a'&&MiWen[i]<='f')
H[i]=MiWen[i]-'a'+10;
}
}
for(i=0;i<n;i++) //将十进制密文转化成二进制存放在数组C中
{
int he[4]={0,0,0,0};
for(j=3;H[i]!=0;j--)
{
he[j]=H[i]%2;
H[i]=H[i]/2;
}
for(j=0;j<4;j++)
C[j+(i*4)]=he[j];
}
//for(i=0;i<130;i++)
// printf("%d,",C[i]);
//printf("\n");
k=n/16;
for(l=0;l<k;l++)
{
for(i=0;i<64;i++) //将每个分组对应的64位二进制密文放到text_out中
text_out[l+1][i]=C[i+(l*64)];
//for(i=0;i<64;i++)
// printf("%d,",text_out[l][i]);
//printf("\n");
//对每个text进行DES解密
for(i=0;i<64;i++) //进行初始换位
text_ip[i]=text_out[l+1][IP[i]-1];
//for(i=0;i<64;i++)
//printf("%d,",text_ip[i]);
//printf("\n");
for(i=0;i<32;i++) //分成左右两部分,各32位
{
L0[i]=text_ip[i];
R0[i]=text_ip[i+32];
}
//for(i=0;i<32;i++)
// printf("%d,",L0[i]);
//for(i=0;i<32;i++)
// printf("%d,",R0[i]);
//十六次迭代
for(t=0;t<16;t++)
{
for(i=0;i<48;i++) //将右半部分通过扩展换位表E从32位扩展成48位
RE0[i]=R0[E[i]-1];
//printf("RE0\n");
//for(i=0;i<48;i++)
//printf("%d,",RE0[i]);
for(i=0;i<48;i++) //RE与K异或运算
RK[i]=RE0[i]^K[15-t][i];
//printf("\n");
//for(i=0;i<48;i++)
//printf("%d,",RK[i]);
for(i=0;i<8;i++) //将R和K异或运算的结果通过S位移表
{
r[i]=RK[(i*6)+0]*2+RK[(i*6)+5];
c[i]=RK[(i*6)+1]*8+RK[(i*6)+2]*4+RK[(i*6)+3]*2+RK[(i*6)+4];
}
RKS[0]=S1[r[0]][c[0]];
RKS[1]=S2[r[1]][c[1]];
RKS[2]=S3[r[2]][c[2]];
RKS[3]=S4[r[3]][c[3]];
RKS[4]=S5[r[4]][c[4]];
RKS[5]=S6[r[5]][c[5]];
RKS[6]=S7[r[6]][c[6]];
RKS[7]=S8[r[7]][c[7]];
for(i=0;i<8;i++) //把结果转成32位二进制储存在数组SP中
{
int b[4]={0,0,0,0};
m=RKS[i];
for(j=3;m!=0;j--)
{
b[j]=m%2;
m=m/2;
}
for(j=0;j<4;j++)
SP[j+(i*4)]=b[j];
}
for(i=0;i<32;i++) //将二进制结果再经过一个P盒换位
RKSP[i]=SP[P[i]-1];
for(i=0;i<32;i++) //与前一次的左部异或运算,得到本次迭代的右部
Ri[i]=L0[i]^RKSP[i];
for(i=0;i<32;i++)
{
L0[i]=R0[i];
R0[i]=Ri[i];
}
}
//一个左右32位交换
for(i=0;i<32;i++)
Li[i]=R0[i];
for(i=0;i<32;i++)
R0[i]=L0[i];
for(i=0;i<32;i++)
L0[i]=Li[i];
//初始换位的逆过程
for(i=0;i<32;i++) //把左右两部分合起来存到text_end中
text_end[i]=L0[i];
for(i=32;i<64;i++)
text_end[i]=R0[i-32];
for(i=0;i<64;i++) //进行初始换位的逆过程
text[IP[i]-1]=text_end[i];
//CBC模式下的解密
for(i=0;i<64;i++) //前一分组的密文异或当前分组所得明文的二进制放到result中
result[l][i]=text_out[l][i]^text[i];
}
for(i=0;i<(n/16);i++) //将二进制转成十进制
for(j=0;j<8;j++)
M[i][j]=result[i][(j*8)+0]*128+result[i][(j*8)+1]*64+result[i][(j*8)+2]*32+result[i][(j*8)+3]*16+result[i][(j*8)+4]*8+result[i][(j*8)+5]*4+result[i][(j*8)+6]*2+result[i][(j*8)+7];
printf("您的文件经过DES解密后的明文是:\n");
for(i=0;i<(n/16);i++)
for(j=0;j<8;j++)
printf("%c",M[i][j]);
printf("\n\n\n");
}
flag=0;
printf("是否继续?\n");
printf("Y继续,N退出,请选择:\n");
scanf("%c",&choice);
while(choice!='Y'&&choice!='N'&&choice!='y'&&choice!='n')
{printf("对不起,您的输入不合法。请选择Y或N,Y表示继续使用本程序,N表示退出。\n");
scanf("%c",&choice);
}
getchar();
if(choice=='Y'||choice=='y')
flag=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -