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

📄 desencrptiondlg.cpp

📁 DES加密程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
		ShowText();
		if(DESRound==17)
		{
			bool re[64];
			getResult(bRnew,bLnew,re);
			CString result=BtoS(re,64);
			MessageBox(result,"加密结果",1);
			m_ResultEdit+="THE FINALL RESULT IS:";
			m_ResultEdit+=result;
			m_ResultEdit+="\r\n";
			m_finalResult=result;
			UpdateData(false);
			DESRound=1;
			
		}
	}
}

CString CDESEncrptionDlg::BtoS(bool b[],int length)  //把bool数组转换成十六进制串
{
	CString result="";
	int temp;
	int sum=0;
	unsigned char tempc;
	for(int i=0;i<length;i+=4)
	{
		sum=0;
		tempc=0;
		for(int j=0;j<4;j++)
		{
			temp=b[i+j];
			sum=sum*2+temp;
		}
		if(sum<10)
			tempc=sum+48;           //30-------39H
		else
			tempc=sum+48+7;
		result+=tempc;
		
	}
	return result;
}

void CDESEncrptionDlg::ShowText()          //显示输出的控制函数
{
	m_ResultEdit+="L";
	char c3[2],c4[2];
	CString c1,c2;
	c1.Format("%d",(DESRound-2));
	c2.Format("%d",(DESRound-1));
	m_ResultEdit+=c1;
	m_ResultEdit+=": ";
	m_ResultEdit+=m_Lold;
	m_ResultEdit+="   R";
	m_ResultEdit+=c1;
	m_ResultEdit+=": ";
	m_ResultEdit+=m_Rold;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="K";
	m_ResultEdit+=c2;
	m_ResultEdit+=":  ";
	m_ResultEdit+=m_K;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="ER:  ";
	m_ResultEdit+=m_ER;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="XOR:  ";
	m_ResultEdit+=m_XOR;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="S:  ";
	m_ResultEdit+=m_S;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="F: ";
	m_ResultEdit+=m_F;
	m_ResultEdit+="\r\n";
	m_ResultEdit+="L";
	m_ResultEdit+=c2;
	m_ResultEdit+=":  ";
	m_ResultEdit+=m_Lnew;
	m_ResultEdit+="   R";
	m_ResultEdit+=c2;
	m_ResultEdit+=":  ";
	m_ResultEdit+=m_Rnew;
	m_ResultEdit+="\r\n\r\n";
	m_Lold="";m_Rold="";m_K="";m_ER="";m_XOR="";m_S="";m_F="";
	UpdateData(false);
}

void CDESEncrptionDlg::OnLookForCode()      //源代码子窗口
{
	codeFrame.DoModal();	
}

CString CDESEncrptionDlg::getResult(bool b1[],bool b2[],bool b3[])   //得到16轮转换结果的十六进制
{
	bool r[64];
	for(int i=0;i<32;i++)
	{
		r[i]=b1[i];
		r[i+32]=b2[i];
	}
	Transfer(ipres,r,b3,64);
	return "";
}

void CDESEncrptionDlg::ComputeKey()          //计算16个密钥
{
	bool b64[64];
	bool bForKey[56];       // save the pre key
	CString key=m_OutputVar;
	Analysis(key,b64,64);
	//DecimalToBinary(key,b64,64);
	Transfer(PC1,b64,bForKey,56);
	
	for(int i=0;i<16;i++)
	{
		LeftMove(bForKey,iter[i][1]);
		Transfer(PC2,bForKey,bKeys[i],48);           //bKeys is two dimensional bool array
		//CString s=BtoS(bKeys[i],48);
		//MessageBox(s);
	}	
}

void CDESEncrptionDlg::OnEncrptionButton()           //文件加密
{
	int len=m_OutputVar.GetLength();
	if(m_edit1==""||m_edit2=="")
	{
		MessageBox("请填好文件路径","警告",1);
	}
	else if(m_OutputVar=="")
	{
		MessageBox("请填好密钥","警告",1);
	}
	else if(len<16)
	{
		MessageBox("请填入足够的密钥字符数,至少为16个","警告",1);
	}
	else
	{
		ComputeKey();
		CFile inFile;                         //得到文件长度
		CFile outFile;

		inFile.Open(m_edit1,CFile::modeRead);
		outFile.Open(m_edit2,CFile::modeWrite|CFile::modeCreate);
		int length=inFile.GetLength();
		rest=length%8;
		CString temp="";
		DWORD dwordl;
		DWORD dwordh;
		char tempc[8];
		char *tryc=new char[16];
		clock_t start= clock();      //origin start time
		int wholenum=length/8;            //利用文件缓冲区来加快速度
		//clock_t start= clock();
		for(int i=0;i<length/8;i++)       
		{
			wholenum-=512;

			if(wholenum>=0)
			{
				
				BYTE *tempcc=new BYTE[4096];
				inFile.Read(tempcc,4096);
				for(int kk=0;kk<512;kk++){
					temp="";
					for(int j=0;j<8;j++)
					{
						temp+=tempcc[j+kk*8];       
					}
					CString cs=Encrp(temp);
					for(int k=0;k<8;k++)
					{
						tempcc[k+kk*8]=cs.GetAt(k);
					}
				}
				outFile.Write(tempcc,4096);
				i+=511;
				delete []tempcc;
			}
			else         //当不够4096个字节时的处理
			{
				
				temp="";
				inFile.Read(&tempc,8);
				for(int j=0;j<8;j++)
				{
					temp+=tempc[j];
				}
				//MessageBox(temp);
				CString cs=Encrp(temp);
				for(int k=0;k<8;k++)
				{
					tempc[k]=cs.GetAt(k);
					//MessageBox(temp,"",1);
					
				}
				outFile.Write(&tempc,8);
			}
			
		}
		
		if(rest!=0)      //处理最后一个64位
		{
			CString last2;
			char tc=0;
			for(int i1=0;i1<rest;i1++)
			{
				inFile.Read(&tc,1);
				last2+=tc;
			}
			for(int j1=0;j1<(8-rest);j1++)
			{
				tc=0;
				last2+=tc;
			}
			CString cs=Encrp(last2);
			for(int k=0;k<8;k++)
			{
				tempc[k]=cs.GetAt(k);
				//MessageBox(temp,"",1);
				outFile.Write(&tempc[k],1);
			}
		}
		temp="";
		DWORD dw=length;
		//DWORD dw1=0;
		//cst+=dw1;
		temp+=dw;
		CString cst=temp;
		
		int tempt=temp.GetLength();
		int m;char c=0;temp="";
		for(m=0;m<(8-tempt);m++)
		{
			temp+=c;                    //记录文件的总长度
		}
		temp+=cst;
		CString cs=Encrp(temp);
		for(m=0;m<8;m++)
		{
			tempc[m]=cs.GetAt(m);
			outFile.Write(&tempc[m],1);
		}
		
		dw=0;
		for(int i2=0;i2<8;i2++)
		{
			char cr=temp.GetAt(i2);
			if(cr==0)
				continue;
			else
			{
				dw=dw<<8;
				dw+=cr;
			}
		}
		temp=dw;
		
		inFile.Close();
		outFile.Close();
		clock_t finish= clock();
		double totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
		totaltime=length/(totaltime*1024*1024*1.0);
		CString s;
		s.Format("%f",totaltime);
		m_speed=s;								//origin end time
		UpdateData(false);
	}
	
}

void CDESEncrptionDlg::OnDecrptionButton()                   //文件解密
{
	int len=m_OutputVar.GetLength();
	if(m_edit2==""||m_edit3=="")
	{
		MessageBox("请填好文件路径","警告",1);
	}
	else if(m_OutputVar=="")
	{
		MessageBox("请填好密钥","warn",4);
	}
	else if(len<16)
	{
		MessageBox("请填入足够的密钥字符数,至少为16个","警告",1);
	}
	else
	{
		ComputeKey();	
		CFile inFile;                         //得到文件长度
		CFile outFile;
		CFileException e;
		inFile.Open(m_edit2,CFile::modeRead,&e);
		outFile.Open(m_edit3,CFile::modeWrite|CFile::modeCreate);
		int length=inFile.GetLength();
		rest=length%8;
		CString temp="";
		DWORD dwordl;
		DWORD dwordh;
		char tempc[8];
		CString cs1,cs2;
		int wholenum=length/8;
		clock_t start= clock();
		wholenum-=512;           //先减掉32,防止对结尾的操作复杂
		for(int i=0;i<length/8;i++)
		{
			wholenum-=512;
			if(wholenum>=0)         //保证不会遇到文件尾
			{
				BYTE *tempcc=new BYTE[4096];
				inFile.Read(tempcc,4096);
				for(int kk=0;kk<512;kk++){
					temp="";
					for(int j=0;j<8;j++)
					{
						temp+=tempcc[j+kk*8];       //????????????
					}
					CString cs=Decrp(temp);
					for(int k=0;k<8;k++)
					{
						tempcc[k+kk*8]=cs.GetAt(k);
					}
				}
				outFile.Write(tempcc,4096);
				i+=511;
				delete []tempcc;
			}
			else
			{
				temp="";
				inFile.Read(&tempc,8);
				for(int j=0;j<8;j++)
				{
					temp+=tempc[j];
				}
				CString cs=Decrp(temp);

				if(i==length/8-2)    // second to last
				{
					cs1=cs;
				}
				else if(i==length/8-1)   //last
				{
					cs2=cs;
				}
				else
				{	
					for(int k=0;k<8;k++)
					{
						tempc[k]=cs.GetAt(k);
					}
					outFile.Write(&tempc,8);
				}
			}
			
		}
		//解析cs2
		DWORD dw=0;

		for(int i2=0;i2<8;i2++)   //得到原文件一共有多少个字节
		{
			char cr=cs2.GetAt(i2);
			if(cr==0)
				continue;
			else
			{
				dw=dw<<8;
				dw+=cr;
			}
		}
		int len=dw;
		if(len%8==0)   //如果是八的整数倍
		{
			for(int k=0;k<8;k++)
			{
				tempc[k]=cs1.GetAt(k);
				outFile.Write(&tempc[k],1);
			}
		}
		else           //如果不是8的整数倍
		{
			int r=len%8;
			for(int k1=0;k1<r;k1++)
			{
				tempc[k1]=cs1.GetAt(k1);
				outFile.Write(&tempc[k1],1);
			}
		}
		inFile.Close();
		outFile.Close();
		clock_t finish= clock();
		double totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
		totaltime=length/(totaltime*1024*1024*1.0);
		CString s;
		s.Format("%f",totaltime);
		m_speed=s;
		UpdateData(false);
	}
}

	bool bSource[64];
	bool bip[64];
	bool bLo[32];
	bool bRo[32];
	bool bLn[32];
	bool bRn[32];
	bool bERt[48];
	bool bXORt[48];
	bool bSt[32];
	bool bFt[32];
	bool bRt[64];
	bool bResult[64];

CString CDESEncrptionDlg::Encrp(CString source)          //source is 64 bits     加密循环
{
	
	DecimalToBinary(source,bSource,64);
	
	Transfer(ip,bSource,bip,64);
	
	for(int i=0;i<32;i++)
	{
		bLo[i]=bip[i];
		bRo[i]=bip[32+i];
	}
	for(int round=0;round<16;round++)
	{
		for(i=0;i<32;i++)
		{
			bLn[i]=bRo[i];
		}
		Transfer(E,bRo,bERt,48);	
		xor48(bKeys[round],bERt,bXORt,48);
		sixTofour(bXORt,bSt);
		Transfer(P,bSt,bFt,32);
		xor48(bLo,bFt,bRn,32);
		for(i=0;i<32;i++)
		{
			bLo[i]=bLn[i];
			bRo[i]=bRn[i];
		}
	}
	
	for(i=0;i<32;i++)
	{
		bRt[i]=bRo[i];
		bRt[i+32]=bLo[i];
	}

	Transfer(ipres,bRt,bResult,64);
	CString output=BS(bResult,64);
	return output;

	
}
	
CString CDESEncrptionDlg::Decrp(CString source)            //解密循环
{
	DecimalToBinary(source,bSource,64);           //和加密共用 注意!!!!!!!!!
	Transfer(ip,bSource,bip,64);
	for(int i=0;i<32;i++)
	{
		bLo[i]=bip[i+32];
		bRo[i]=bip[i];
	}
	for(int round=0;round<16;round++)
	{
		for(i=0;i<32;i++)
		{
			bRn[i]=bLo[i];
		}
		Transfer(E,bLo,bERt,48);	
		xor48(bKeys[15-round],bERt,bXORt,48);
		sixTofour(bXORt,bSt);
		Transfer(P,bSt,bFt,32);
		xor48(bRo,bFt,bLn,32);
		for(i=0;i<32;i++)
		{
			bLo[i]=bLn[i];
			bRo[i]=bRn[i];
		}
	}
	for(i=0;i<32;i++)
	{
		bRt[i]=bLo[i];
		bRt[i+32]=bRo[i];
	}
	Transfer(ipres,bRt,bResult,64);
	CString input=BS(bResult,64);
	return input;
}

CString CDESEncrptionDlg::BS(bool source[],int length)          //把加密后的转化回CString
{
	CString result="";
	int sum=0;
	for(int i=0;i<length;i+=8)
	{
		sum=0;
		for(int j=0;j<8;j++)
		{
			//temp=source.GetAt(i+j);
			sum=sum*2+source[i+j];
		}
		
		result+=sum;    //???????????????????????????小心哪
	}
	return result;
}

bool CDESEncrptionDlg::Analysis(CString strDecimal,bool b[],int l)          //解析输入
{
	bool sign=true;
	CString temps;
	unsigned char tempc;
	for(int i=0;i<16;i++)
	{
		tempc=strDecimal.GetAt(i);
		switch(tempc)
		{
			case '0': 
			b[i*4]=0;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=0;break;
			case '1': 
			b[i*4]=0;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=1;break;
			case '2': 
			b[i*4]=0;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
			case '3': 
			b[i*4]=0;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
			case '4': 
			b[i*4]=0;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
			case '5': 
			b[i*4]=0;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
			case '6': 
			b[i*4]=0;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
			case '7': 
			b[i*4]=0;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
			case '8': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=0;break;
			case '9': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=1;break;
			case 'a': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
			case 'b': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
			case 'c': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
			case 'd': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
			case 'e': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
			case 'f': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
			case 'A': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
			case 'B': 
			b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
			case 'C': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
			case 'D': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
			case 'E': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
			case 'F': 
			b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
			default: sign=false; break;
		}
	}
	return sign;
}

⌨️ 快捷键说明

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