📄 des_example.cpp
字号:
#include<iostream.h>
#include<stdio.h>
void main(){
int temp1,temp2,temp3,row,line,i,j,u,z;float a,total;
FILE *fp1,*fp2;
int plain[64];
int IP[64],Exp[48],sbox[32],pbox[32],endIP[64];
cout<<"输入明文十进制:";
double pl,temp4=1;
cin>>pl;
for(j=0;j<32;j++)temp4=temp4*2;
unsigned long int pleft=(unsigned long int)(pl/temp4);
unsigned long int plefttemp=pleft;
for(j=31;j>=0;j--){plain[j]=pleft%2;pleft=pleft/2;}
double prighttemp=pl-((double)plefttemp)*temp4;
unsigned long int pright=(unsigned long int)prighttemp;
for(j=63;j>=32;j--){plain[j]=pright%2;pright=pright/2;}
cout<<"明文64位二进制:"<<endl;
for(j=0;j<64;j++){cout<<plain[j];if((j+1)%8==0)cout<<endl;}
fp1=fopen("Tab01_IP.txt","r");
for(j=0;j<64;j++){
fscanf(fp1,"%d",&i);
i=i-1;
IP[j]=plain[i];
}
fclose(fp1);
//***
int pkey[64];
cout<<"输入密钥十进制:";
double pk,temp5=1;
cin>>pk;
for(j=0;j<32;j++)temp5=temp5*2;
unsigned long int kleft=(unsigned long int)(pk/temp5);
unsigned long int klefttemp=kleft;
for(j=31;j>=0;j--){pkey[j]=kleft%2;kleft=kleft/2;}
double krighttemp=pk-((double)klefttemp)*temp5;
unsigned long int kright=(unsigned long int)krighttemp;
for(j=63;j>=32;j--){pkey[j]=kright%2;kright=kright/2;}
cout<<"密钥64位二进制:"<<endl;
for(j=0;j<64;j++){cout<<pkey[j];if((j+1)%8==0)cout<<endl;}
int PC_1[56],PC_2[48];
fp1=fopen("Tab02_PC_1.txt","r");
for(j=0;j<56;j++){
fscanf(fp1,"%d",&i);
i=i-1;
PC_1[j]=pkey[i];
}
fclose(fp1);
//***
fp2=fopen("move.txt","r");
for(u=0;u<16;u++)
{
fscanf(fp2,"%d",&i);
temp1=PC_1[i-1];
if(i>1)temp2=PC_1[i-2];
for(j=0;j<28-i;j++)
PC_1[j]=PC_1[j+i];
PC_1[27]=temp1;
if(i>1)PC_1[26]=temp2;
temp1=PC_1[28+i-1];
if(i>1)temp2=PC_1[28+i-2];
for(j=28;j<56-i;j++)
PC_1[j]=PC_1[j+i];
PC_1[55]=temp1;
if(i>1)PC_1[54]=temp2;
//***
fp1=fopen("Tab03_PC_2.txt","r");
for(j=0;j<48;j++){
fscanf(fp1,"%d",&i);
i=i-1;
PC_2[j]=PC_1[i];
}
fclose(fp1);
a=1;total=0;
for(j=47;j>=0;j--)
{total=PC_2[j]*a+total;a=a*2;}
cout<<"子密钥K"<<u+1<<":"<<total<<endl;
//***
fp1=fopen("Tab04_Expand.txt","r");
for(j=0;j<48;j++){
fscanf(fp1,"%d",&i);
i=i-1;
Exp[j]=IP[i+32];
}
fclose(fp1);
//***
for(j=0;j<48;j++)
Exp[j]=Exp[j]^PC_2[j];
//***
for(z=0;z<8;z++){
row=Exp[z*6+1]*8+Exp[z*6+2]*4+Exp[z*6+3]*2+Exp[z*6+4];
line=Exp[z*6]*2+Exp[z*6+5];
switch(z){
case 0:fp1=fopen("Tab05_S1.txt","r");break;
case 1:fp1=fopen("Tab06_S2.txt","r");break;
case 2:fp1=fopen("Tab07_S3.txt","r");break;
case 3:fp1=fopen("Tab08_S4.txt","r");break;
case 4:fp1=fopen("Tab09_S5.txt","r");break;
case 5:fp1=fopen("Tab10_S6.txt","r");break;
case 6:fp1=fopen("Tab11_S7.txt","r");break;
case 7:fp1=fopen("Tab12_S8.txt","r");
}
// fseek(fp1,line*16+row,0);
for(j=0;j<line*16+row+1;j++)fscanf(fp1,"%d",&i);
for(j=3;j>=0;j--){
sbox[z*4+j]=i%2;i=i/2;}
}
fclose(fp1);
//***
fp1=fopen("Tab13_P.txt","r");
for(j=0;j<32;j++){
fscanf(fp1,"%d",&i);
i=i-1;
pbox[j]=sbox[i];
}
fclose(fp1);
//***
for(j=0;j<32;j++)
IP[j]=IP[j]^pbox[j];
//***
if(u<15)
for(j=0;j<32;j++){
temp3=IP[j];
IP[j]=IP[j+32];
IP[j+32]=temp3;
}
}
fclose(fp2);
//***
fp1=fopen("Tab14_endIP.txt","r");
for(j=0;j<64;j++){
fscanf(fp1,"%d",&i);
i=i-1;
endIP[j]=IP[i];
}
fclose(fp1);
cout<<"密文:"<<endl;
for(j=0;j<64;j++){cout<<endIP[j];if((j+1)%8==0)cout<<endl;}
a=1;total=0;
for(j=63;j>=0;j--){total=endIP[j]*a+total;a=a*2;}
cout<<"其十进制:"<<endl<<total<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -