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

📄 dse.cpp

📁 DES加密解密算法,该程序是用DES 加密算法对文件进行加密
💻 CPP
字号:
#include"declare.h"
void InitRead()
{//从文件中读入数据
	int i;
	char a[16];//a[16]只在本函数使用
	FILE *fp;
    if ((fp=fopen("InitPlaintext.txt","rb"))==NULL)
	{
		printf("Cannot open the file!\n");
		exit(0);
	}
	for(i=0;i<16;i++)
		fread(&a[i],sizeof(char),16,fp);
    for(i=0;i<16;i++)
		T[i]=a[i]-48;
   cout<<"班号:  09040602    姓名:  李振    学号:  062255"<<endl<<endl;
   cout<<"身份证件号码前16位: ";
   for(i=0;i<16;i++)
		cout<<T[i];
   cout<<endl<<endl;
	//    printf("%c  ",a[i]);
    fclose(fp);
	printf("明文是:");
   for(i=0;i<16;i++)
   { 
	   Binary(T[i]);
   }
   for(i=0;i<64;i++)
   {
	   cout<<Text[i];
	   if((i+1)%8==0)
          cout<<" ";
   }  
}
void InitKey()
{
	int i;
	FILE *fp1;
	if ((fp1=fopen("Key.txt","rb"))==NULL)
	{
		printf("Cannot open the file!\n");
		exit(0);
	}
	for(i=0;i<7;i++)
		fread(&k[i],sizeof(char),7,fp1);
//	for(i=0;i<7;i++)//输出每个密钥字符的ASCII码
//	printf("%d",k[i]);
//	cout<<endl;
	for(i=0;i<7;i++)
    	Binary1(k[i]);
}
bool XOR(bool &a,bool &b)//异或函数
{
	if(a==b)
	return 0;
	else return 1;
	
}
void Binary(int n)//将字符转化成8421BCD码
{
	int i=0,c[4]={0},t;
	static int j=0;
	
	char B[4]={0};//每个数字对应的4位二进制码
 do
	{	
		t=n%2;
		n=n/2;
		c[i++]=t;
	}while(n!=0);
	
for(i=0;i<4 ;i++){
		B[i]=c[3-i]+48;
		Text[j++]=B[i]-48;
		//printf("%c",B[i]);			
	}
    //printf(" ");
}
void Binary1(int n)//将字符转化成二进制码
{
	int i=0,c[8]={0},t;
	static int j=0;
	
	char B1[8]={0};//每个字符对应的8位二进制码
 do
	{	
		t=n%2;
		n=n/2;
		c[i++]=t;
	}while(n!=0);
for(i=0;i<8;i++){
		B1[i]=c[7-i]+48;
		Key1[j++]=B1[i]-48;
		//printf("%c",B1[i]);			
	}

    //printf(" ");
}
void Binary2(int n,bool a[4])//将十进制数转化为四位二进制数
{
	int i=0,c[4]={0},t;
	do
	{	
		t=n%2;
		n=n/2;
		c[i++]=t;
	}while(n!=0);
	for(i=0;i<4 ;i++)
		a[i]=c[3-i];
}



/*void IP_Convert()//进行IP变换 
{
	int i,j;
	for(i=0;i<8;i++) 
    for(j=0;j<8;j++) 
        Text_IP[i][j]=Text[IP[i][j]-1]; 
}*/
void MakeSubKey()//产生子密钥
{
	bool KeyPC_1[56]={0};
	int i,j;
	for(i=0,j=0;i<56;i++)
	{
		Key[j++]=Key1[i];
		if((i+1)%7==0)
				j++;
	}

	 printf("密钥是:");
  for(i=0;i<64;i++)
   {
      cout<<Key[i];
      if((i+1)%8==0)
          cout<<" ";
  }
  cout<<endl<<endl;
	for(i=0;i<8;i++)
		for(j=0;j<7;j++)
		{
			KeyPC_1[7*i+j]=Key[PC_1[i][j]-1];
		}//密钥通过PC_1置换后
	for(i=0;i<56;i++)
	{
		if(i<28)
			C[0][i]=KeyPC_1[i];
		else D[0][i-28]=KeyPC_1[i];
	}//通过PC_1已验证正确
	for(i=0;i<16;i++)
	{
		for(j=0;j<28;j++)
		{
			C[i+1][j]=C[i][(j+LS[i])%28];
            D[i+1][j]=D[i][(j+LS[i])%28];
		}
		for(j=0;j<56;j++)
		{
			if(j<28)
				CD[i+1][j]=C[i+1][j];
			else CD[i+1][j]=D[i+1][j-28];
		}
		for(j=0;j<48;j++)
		SubKey[i][j]=CD[i+1][PC_2[j/6][j%6]-1];
		cout<<"第"<<i+1<<"轮的子密钥是:  ";
		for(j=0;j<48;j++)
			cout<<SubKey[i][j];
		cout<<endl<<endl;
	}//子密钥产生过程,已验证正确

} 
void Function(bool Right[32],int x)
{
	int i,j,m,n,y[8]={0};
	bool E[16][48]={0},Bef_SBox[8][6]={0},Out_SBox[16][32]={0},a[4]={0};
	for(i=0;i<48;i++)
		E[x][i]=Right[E_Table[i/6][i%6]-1];//已验证

	for(i=0;i<8;i++)
		for(j=0;j<6;j++)
		{
			Bef_SBox[i][j]=XOR(E[x][6*i+j],SubKey[x][6*i+j]);
		}
	for(m=0;m<8;m++)//已验证正确
	{
		
		y[m]=S_Box[m][2*Bef_SBox[m][0]+Bef_SBox[m][5]][8*Bef_SBox[m][1]+4*Bef_SBox[m][2]+2*Bef_SBox[m][3]+Bef_SBox[m][4]];
        Binary2(y[m],a);//y[m]是S盒对应的数
		for(n=0;n<4;n++)
  		    Out_SBox[x][m*4+n]=a[n];		
	}	
	for(i=0;i<32;i++)//正确
	   Fun[x][i]=Out_SBox[x][P_Table[i/4][i%4]-1];

}
void Function2(bool Left[32],int x)
{
	int i,j,m,n,y[8]={0};
	bool E[16][48]={0},Bef_SBox[8][6]={0},Out_SBox[16][32]={0},a[4]={0};
	for(i=0;i<48;i++)
		E[x][i]=Left[E_Table[i/6][i%6]-1];

	for(i=0;i<8;i++)
		for(j=0;j<6;j++)
		{
			Bef_SBox[i][j]=XOR(E[x][6*i+j],SubKey[15-x][6*i+j]);
		}
	for(m=0;m<8;m++)//已验证正确
	{
		
		y[m]=S_Box[m][2*Bef_SBox[m][0]+Bef_SBox[m][5]][8*Bef_SBox[m][1]+4*Bef_SBox[m][2]+2*Bef_SBox[m][3]+Bef_SBox[m][4]];
        Binary2(y[m],a);
		for(n=0;n<4;n++)
  		    Out_SBox[x][m*4+n]=a[n];		
	}	
	for(i=0;i<32;i++)//正确
	   Fun2[x][i]=Out_SBox[x][P_Table[i/4][i%4]-1];

}
void Encode()
{
	int i,j;
	bool Bef_IP_1[64]={0};//通过IP_1之前
	for(i=0;i<8;i++) 
    for(j=0;j<8;j++) 
        Text_IP[i][j]=Text[IP[i][j]-1]; 
	for(i=0;i<8;i++)
		for(j=0;j<8;j++)
		{
			if(i*8+j<32)
				L[0][8*i+j]=Text_IP[i][j];
			else R[0][8*i+j-32]=Text_IP[i][j];
		}//已验证正确
	for(i=0;i<16;i++)//已验证循环1
	{
		Function(R[i],i);//产生子密钥函数
		for(j=0;j<32;j++)
		{
			L[i+1][j]=R[i][j];
			R[i+1][j]=XOR(L[i][j],Fun[i][j]);
		}
	}
	for(i=0;i<64;i++)
	{
		if(i<32)
			Bef_IP_1[i]=R[16][i];
		else Bef_IP_1[i]=L[16][i-32];
	}
	for(i=0;i<64;i++)
	{
		Ciphertext[i]=Bef_IP_1[IP_1[i/8][i%8]-1];
	}
	cout<<"***************************************************************************************"<<endl<<endl;
	cout<<"加密过程的子密钥函数:";
   cout<<endl;
   for(i=0;i<16;i++)
   {  	   
	   cout<<endl;
	   cout<<"第"<<i+1<<"轮的加密子密钥函数是:";
	 for(j=0;j<32;j++)
	  {
		  cout<<Fun[i][j];
	  }
	 cout<<endl;
   }
   cout<<endl;
   for(i=0;i<17;i++)
   {
	   cout<<"L"<<i<<"为"<<":";
		   for(j=0;j<32;j++)
			   cout<<L[i][j];
		   cout<<"     ";
		   cout<<"R"<<i<<"为"<<":";
		   for(j=0;j<32;j++)
			   cout<<R[i][j];
		   cout<<endl<<endl;
   }
	cout<<"加密后的密文是:";
	for(i=0;i<64;i++)
    {
		cout<<Ciphertext[i];
		if((i+1)%8==0)
          cout<<" ";
	}
	cout<<endl;
}
void Decode()
{
	int i,j;
	bool Af_IP[64]={0},Bef_IP_1[64]={0};
    for(i=0;i<64;i++)
	{
		Af_IP[i]=Ciphertext[IP[i/8][i%8]-1];
		
	}
	for(i=0;i<64;i++)
	{
		if(i<32)
			DeL[0][i]=Af_IP[i];
		else DeR[0][i-32]=Af_IP[i];
	}

	for(i=0;i<16;i++)
	{
		Function2(DeR[i],i);//解密时产生子密钥函数
		for(j=0;j<32;j++)
		{
			DeL[i+1][j]=DeR[i][j];
			DeR[i+1][j]=XOR(DeL[i][j],Fun2[i][j]);
		}
	}
	for(i=0;i<64;i++)
	{
		if(i<32)
			Bef_IP_1[i]=DeR[16][i];
		else Bef_IP_1[i]=DeL[16][i-32];
	}
	cout<<"***************************************************************************************"<<endl<<endl;
		cout<<"解密过程的子密钥函数:";
   cout<<endl;
   for(i=0;i<16;i++)
   {  	   
	   cout<<endl;
	   cout<<"第"<<i+1<<"轮的解密子密钥函数是:";
	 for(j=0;j<32;j++)
	  {
		  cout<<Fun2[i][j];
	  }
	 cout<<endl;
   }
   cout<<endl;
   for(i=0;i<17;i++)
   {
	   cout<<"L"<<i<<"为"<<":";
		   for(j=0;j<32;j++)
			   cout<<DeL[i][j];
		   cout<<"     ";
		   cout<<"R"<<i<<"为"<<":";
		   for(j=0;j<32;j++)
			   cout<<DeR[i][j];
		   cout<<endl<<endl;
   }
	cout<<"解密后的明文是:";
	for(i=0;i<64;i++)
	{
		Plaintext[i]=Bef_IP_1[IP_1[i/8][i%8]-1];
		cout<<Plaintext[i];
		if((i+1)%8==0)
          cout<<" ";
	}

	cout<<endl;

}
void OutputCiphertext()//输出密文到Ciphertext.txt文件中
{
	int i,Out[16];
	FILE *fp;
	for(i=0;i<16;i++)
	{
		Out[i]=8*Ciphertext[4*i]+4*Ciphertext[4*i+1]+2*Ciphertext[4*i+2]+Ciphertext[4*i+3];
	}

	fp=fopen("Ciphertext.txt","wb+");
     	if(fp==NULL)
	{
		printf("Cannot open the file!\0");
		exit(0);
	}
		for(i=0;i<16;i++)
			fprintf(fp,"%d",Out[i]);
}
void OutputPlaintext()//输出解密后的明文到Plaintext.txt中
{
	int i,Out[16];
	FILE *fp;
	
	for(i=0;i<16;i++)
	{
		Out[i]=8*Plaintext[4*i]+4*Plaintext[4*i+1]+2*Plaintext[4*i+2]+Plaintext[4*i+3];
	}
    fp=fopen("Plaintext.txt","wb+");
     	if(fp==NULL)
	{
		printf("Cannot open the file!\0");
		exit(0);
	}
		for(i=0;i<16;i++)
			fprintf(fp,"%d",Out[i]);
}

void main()
{
   InitRead();//从文件中读入数据
   cout<<endl<<endl;   
   InitKey();//将密文转化成二进制
   MakeSubKey();//产生子密钥
   cout<<endl;
   Encode();//加密过程
   Decode();//解密过程
   cout<<endl;
   OutputCiphertext();//输出密文,格式为Ciphertext.txt
   OutputPlaintext();//输出解密后的明文,格式为Plaintext.txt
   cout<<"注:原始明文和密钥是从当前文件夹里InitPlaintext.txt和Key.txt中读入的,产生的密文和解密后"<<endl<<endl<<"的明文分别在Ciphertext.txt和Plaintext.txt文本文档中"<<endl<<endl;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -