#include<stdio.h>
#include<string.h>
#include<math.h>
void erjinzhi(char z[8],int *q)
{
char ch;
int i,j,a=7;
for(i=0;i<8;i++)
{
ch=z[i];
for(j=0;j<8;j++)
{
*(q+a)=ch%2;
//printf("%2d",*(q+a));
ch=ch/2;
a--;
}
//printf("\n");
a=a+16;
}
for(i=0;i<=63;i++)
{
if(i%8==0) printf("\n");
printf("%2d",*(q+i));
}
printf("\n");
}
/*******************************************************************************************************/
void IP_change(int *ip,int *Data)
{
int i,j;
for(i=1;i<=64;i++) //IP变换 OK
{
j=58-i/33+2*(((i-1)/8)%4)-8*((i-1)%8);
*(ip+(i-1))=*(Data+(j-1));
}
/* printf("输出IP置换后的二进制表:\n");
for(i=0;i<=63;i++)
{
if(i%8==0) printf("\n");
printf("%2d",*(ip+i));
}
printf("\n");*/
}
/*******************************************************************************************************/
void L0_R0(int *ip,int (*l)[32], int (*r)[32])
{
int i,j;
//printf("输出L0:\n"); //提取 L0 R0 OK
for(i=0;i<=31;i++)
{
*(*l+i)=*(ip+i);
// if(i%4==0)
// printf("\n");
// printf("%2d",*(*l+i));
}
// printf("\n");
// printf("输出R0:\n");
for(i=0;i<=31;i++)
{
j=i+32;
*(*r+i)=*(ip+j);
// if(i%4==0)
// printf("\n");
// printf("%2d",*(*r+i));
}
// printf("\n");
}
/**********************************************************************************************************/
void L__R(int (*l)[32],int (*r)[32],int i)
{
int j;
for(j=0;j<=31;j++)
*(*(l+i)+j)=*(*(r+i-1)+j); // L(i)=R(i-1) OK
}
/**********************************************************************************************************/
void E_change(int *r_change,int (*r)[32],int a)
{
int i,j,E[48]={31,0,1,2,3,4,3,4,5,6,7,8,
7,8,9,10,11,12,11,12,13,14,15,16,
15,16,17,18,19,20,19,20,21,22,23,24,
23,24,25,26,27,28,27,28,29,30,31,0};
// printf("输出R0经E变换拓展后的二进制表 r_change:\n"); // E变换 OK
for(i=0;i<=47;i++)
{
j=E[i];
*(r_change+i)=*(*(r+a-1)+j);
// if(i%6==0) printf("\n");
// printf("%2d",*(r_change+i));
}
// printf("\n");
}
/**********************************************************************************************************/
void PC_1_bianhuan(int *Key,int *pc_1)
{
int i,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};
// printf("输出KEY 经 PC-1 变换拓展后的二进制表 :\n"); // PC_1 OK
for(i=0;i<=55;i++)
{
*(pc_1+i)=*(Key+PC_1[i]);
// if(i%8==0) printf("\n");
// printf("%2d",*(pc_1+i));
}
// printf("\n");
}
/*************************************************************************************************/
void CD(int *pc_1,int (*c)[28],int (*d)[28])
{
int i;
for(i=0;i<=27;i++)
{
*(*c+i)=*(pc_1+i);
*(*d+i)=*(pc_1+i+28); // C0 D0 OK
}
/* printf("输出 C0 密钥:\n");
for(i=0;i<=27;i++)
{
if(i%8==0) printf("\n");
printf("%2d",*(*c+i));
}
printf("\n");
printf("输出 D0 密钥:\n");
for(i=0;i<=27;i++)
{
if(i%8==0) printf("\n");
printf("%2d",*(*d+i));
}
printf("\n");*/
}
/***************************************************************************************************/
void LS_yiwei(int (*p)[28],int i)
{
int j;
if(i==1||i==2||i==9||i==16)
{
for(j=0;j<=27;j++)
{
if(j==27)
*(*(p+i)+j)=*(*(p+i-1)+0);
else
*(*(p+i)+j)=*(*(p+i-1)+j+1); // C D移位 OK
}
}
else
{
for(j=0;j<=27;j++)
{
if(j==26)
*(*(p+i)+j)=*(*(p+i-1)+0);
else if(j==27)
*(*(p+i)+j)=*(*(p+i-1)+1);
else
*(*(p+i)+j)=*(*(p+i-1)+j+2);
}
}
/* printf("输出C D YIWEI 密钥:\n");
for(j=0;j<=27;j++)
{
if(j%8==0) printf("\n");
printf("%2d",*(*(p+i)+j));
}
printf("\n");*/
}
/***************************************************************************************************/
void CD_hebin(int *pc_1,int (*c)[28],int (*d)[28],int i)
{
int j;
for(j=0;j<=27;j++)
{
*(pc_1+j)=*(*(c+i)+j);
*(pc_1+j+28)=*(*(d+i)+j);
}
/* printf("输出C D hebin 密钥:\n");
for(j=0;j<=55;j++)
{
if(j%8==0) printf("\n");
printf("%2d",*(pc_1+j));
}
printf("\n");*/
}
/***************************************************************************************************/
void PC_2_bianhuan(int (*kout)[48],int *pc_1,int a)
{
int i,j,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};
// printf("输出提取48位密钥K:\n");
for(i=0;i<=47;i++) // 提取48位密钥K(a-1) OK
{
j=PC_2[i];
*(*(kout+a-1)+i)=*(pc_1+j);
// if(i%8==0) printf("\n");
// printf("%2d",*(*(kout+a-1)+i));
}
// printf("\n");
}
/****************************************************************************************************/
void P_replace(int *p,int *s1)
{
int i,j,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};
// printf("P变换\n");
// printf("\n");
for(i=0;i<=31;i++) // P 变换
{
j=P[i];
*(p+i)=*(s1+j);
// if(i%4==0) printf("\n");
// printf("%2d",*(p+i));
}
// printf("\n");
}
/****************************************************************************************************/
void yihuo1(int *r_change,int (*kout)[48],int a)
{
int i;
// printf("R K yihuo\n"); // r_change R(i-1) E变换后与 Ki 异或
for(i=0;i<=47;i++)
{
*(r_change+i)^=*(*(kout+a-1)+i);
// if(i%6==0) printf("\n");
// printf("%2d",*(r_change+i));
}
// printf("\n");
}
/***************************************************************************************************/
void yihuo2(int (*l)[32],int (*r)[32],int *p,int a)
{
int i;
// printf("L Ptihuanhou yihuo\n"); // R(i) P盒置换后与L(i-1)异或
for(i=0;i<=31;i++)
{
*(*(r+a)+i)=*(*(l+a-1)+i)^*(p+i);
// if(i%4==0) printf("\n");
// printf("%2d",*(*(r+a)+i));
}
// printf("\n");
}
/*************************************************************************************************/
void IP2(int (*l)[32],int (*r)[32],int *ip_1,int a)
{
int i,ip[64],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};
printf(" a = %2d\n",a);
for(i=0;i<=31;i++)
{
ip[i]=*(*(r+a)+i);
ip[i+32]=*(*(l+a)+i);
}
for(i=0;i<=63;i++)
{
if(i%8==0) printf("\n");
printf("%2d",ip[i]);
}
printf("\n");
printf(" IP逆\n");
for(i=0;i<=63;i++)
{
*(ip_1+i)=ip[IP_1[i]-1];
if(i%8==0) printf("\n");
printf(" %2d",*(ip_1+i));
}
printf("\n");
}
/*************************************************************************************************/
void miwen(int *ip_1)
{
int i,j,a,c,b,x[8];
for(i=0;i<=7;i++)
{
a=i*8;
x[i]=0;
for(j=7;j>=0;j--)
{
c=*(ip_1+a);
b=pow(2,j);
// printf(" %2d",b);
// printf(" %2d",c);
x[i]=x[i]+b*c;
a++;
}
// printf(" %2d",x[i])
DES_C.rar_DES C_rsa_visual c
版权申诉
118 浏览量
2022-09-19
14:48:44
上传
评论
收藏 581KB RAR 举报
APei
- 粉丝: 65
- 资源: 1万+