请指明一下在红色代码那里究竟是怎么回事??
这是S-DES加密程序 就是简易DES加密!
那里的意思是:
整个是F函数 其含义是
经过ip[8]处理后的8位明文分成左四位和右四位
其中 右四位经过E/P扩展置换也就是(1 2 3 4)变为8位(4 1 2 3 2 3 4 1)的形式
现在把右边的4位变成了8位在和K1异或得到一个8位结果
然后把这8位结果再分成左四位和右四位 分别经过S0 和S1得两个2位结果 然后合成4位结果
这4位然后再与最先经过ip[8]后的左四位异或后得到一个4位结果
最后把这4位结果同ip[8]后的右四位交换左右顺序继续执行一次F函数
#include<stdio.h>
#include <conio.h>
main()
{
int i,temp,temp1,a[8],k[10],k1[8],k2[8],t[8],t1[8],t2[8],p4[4],m[8];
// a[8]8位明文 k[10]10位密钥 k1[8]是8位子密钥k1 k2[8]是8位密钥k2
//temp temp1 临时数组 m[8]8位密文 p4[4]p4z置换
//t[8],t1[8],t2[8]
int p10[10]={3,5,2,7,4,10,1,9,8,6};
int p8[8]={6,3,7,4,8,5,10,9};
int ip[8]={2,6,3,1,4,8,5,7};
int ip1[8]={4,1,3,5,7,2,8,6};
int ep[8]={4,1,2,3,2,3,4,1};
int s0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
int s1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
char c='c';
while(c=='c'||c=='C')
{
//printf("\n\n\n\n\n\********************************************\n\n");
printf("This is the S-DES!");
printf("\n\n\nPlease input a[8] 8bit plaintext:");
for(i=0;i<8;i++)
scanf("%1d",&a[i]);
/* for(i=0;i<8;i++)
printf("%1d",a[i]); */
printf("\n\nPlease input k[10] 10bit Key:");
for(i=0;i<10;i++)
scanf("%1d",&k[i]);
/* for(i=0;i<10;i++)
printf("%1d",k[i]); */
/*下面是算K1与K2*/
for(i=0;i<10;i++)
t[i]=k[p10[i]-1];
temp=t[0];
for(i=0;i<9;i++)
t[i]=t[i+1];
t[9]=t[4];
t[4]=temp;
for(i=0;i<8;i++)
k1[i]=t[p8[i]-1];
temp=t[0];
temp1=t[1];
for(i=0;i<8;i++)
t[i]=t[i+2];
t[8]=t[3];
t[9]=t[4];
t[3]=temp;
t[4]=temp1;
for(i=0;i<8;i++)
k2[i]=t[p8[i]-1];
/*下面是两次f函数运算与ip,ip`,SW得最后密文*/
for(i=0;i<8;i++)
t[i]=a[ip[i]-1];
for(i=0;i<8;i++)
t1[i]=t[ep[i]+4-1];
for(i=0;i<8;i++)
t1[i]=t1[i]^k1[i];
temp=s0[t1[0]*2+t1[3>[t1[1]*2+t1[2>;
temp1=s1[t1[4]*2+t1[7>[t1[5]*2+t1[6>;
p4[0]=temp/2;
p4[1]=temp%2;
p4[2]=temp1/2;
p4[3]=temp1%2;
for(i=0;i<4;i++)
t2[i+4]=t1[i]^p4[i];
for(i=0;i<8;i++)
t1[i]=t2[ep[i]+4-1];
for(i=0;i<8;i++)
t1[i]=t1[i]^k2[i];
temp=s0[t1[0]*2+t1[3>[t1[1]*2+t1[2>;
temp1=s1[t1[4]*2+t1[7>[t1[5]*2+t1[6>;
p4[0]=temp/2;
p4[1]=temp%2;
p4[2]=temp1/2;
p4[3]=temp1%2;
for(i=0;i<4;i++)
t2[i]=t1[i]^p4[i];
for(i=0;i<8;i++)
m[i]=t2[ip1[i]];
printf("\nMiWen Shi : ");
for(i=0;i<8;i++)
printf("%d",m[i]);
printf("\n\nC For Continue !\nAny Else Key To Exit !\n");
c=getch();
}/*END while*/
return 0;
}