⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des_example.cpp

📁 这是一个DES加密解密算法 用C++实现 用密钥对已知的明文进行加密
💻 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 + -