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

📄 desencrptiondlg.cpp

📁 DES加密程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			result=(nDecimal&ruler);
			if(result!=0)
			{
				//temp[j]='1';
				boolArray[j+i*8]=1;
			}
			else
			{
				//temp[j]='0';
				boolArray[j+i*8]=0;
			}
				
			ruler=ruler>>1;
			//strBinary+=temp[j];
		}
	}
	//bool *trybool[64];
	
	//return strBinary; 
}

void CDESEncrptionDlg::Transfer(int array[],bool s[],bool d[],int dimension)
{
	int i;
	for(i=0;i<dimension;i++)
	{
		d[i]=s[(array[i]-1)];
	}
	
}

void CDESEncrptionDlg::OnTransferButton() 
{										  
	
}

void CDESEncrptionDlg::xor48(bool s1[],bool s2[],bool r[],int length)
{
	for(int i=0;i<length;i++)
	{
		if(s1[i]==s2[i])
		{
			r[i]=0;
		}
		else
		{
			r[i]=1;
		}	
	}
}

void CDESEncrptionDlg::sixTofour(bool s[],bool d[])
{
	int row;
	int column;
	int value;
	unsigned char tempc;
	CString cs;
	bool temp[8];
	for(int i=0;i<8;i++)
	{
		row=s[i*6+0]*2+s[i*6+5];
		column=s[i*6+1]*8+s[i*6+2]*4+s[i*6+3]*2+s[i*6+4];
		value=S[i][row*16+column];
		tempc=value;
		cs=tempc;
		DecimalToBinary(cs,temp,8);
		for(int j=0;j<4;j++)
		{
			d[i*4+j]=temp[j+4];
		}
	}

}

CString CDESEncrptionDlg::BinaryToDecimal(CString source,int length)
{
	CString result="";
	CString temp;
	int sum=0;
	for(int i=0;i<length;i++)
	{
		temp=source.GetAt(i);
		sum=sum*2+atoi(temp);
	}
	unsigned char tempc=sum;
	result=tempc;
	
	return result;
}

void CDESEncrptionDlg::OnChangeKeyEdit() 
{
	UpdateData(true);
}



void CDESEncrptionDlg::OnIPButton() 
{
	if(DESRound==1)
	{
		if(m_InputVar=="")
		{
			MessageBox("请填好原文","warn",4);
		}
		else
		{
			CString cstring;
			CString head;
			cstring.Format("%d",(DESRound-1));

			head="R";
			head+=cstring;
			ROsign.SetWindowText(head);
			head.SetAt(0,'L');
			LOsign.SetWindowText(head);

			cstring.Format("%d",(DESRound));
			head="C";
			head+=cstring;
			Csign.SetWindowText(head);
			head.SetAt(0,'D');
			Dsign.SetWindowText(head);
			head.SetAt(0,'K');
			Ksign.SetWindowText(head);
			head.SetAt(0,'L');
			LNsign.SetWindowText(head);
			head.SetAt(0,'R');
			RNsign.SetWindowText(head);

			m_ResultEdit="";
			UpdateData(false);
			bool b64[64];
			bool b64dup1[64];
			int len=m_InputVar.GetLength();
			if(len<16)
			{
				MessageBox("请输入足够的字符,至少16个","警告",1);
			}
			else if(!Analysis(m_InputVar,b64,64))
			{
				MessageBox("对不起,请重新输入有效明文字符!","警告",1);
			}
			//DecimalToBinary(m_InputVar,b64,64);    //temp64 is the 0,1 representation of input
			else
			{
				Transfer(ip,b64,b64dup1,64);

				for(int i=0;i<32;i++)
				{
					bLold[i]=b64dup1[i];
				}
				for(i=0;i<32;i++)
				{
					bRold[i]=b64dup1[i+32];
				}
				

				m_Lold=BtoS(bLold,32);
				m_Rold=BtoS(bRold,32);
				
				UpdateData(false);
				m_nextRound.EnableWindow(false);        //控制按钮的可控性
				m_ipbutton.EnableWindow(false);
				m_leftbutton.EnableWindow(true);
				m_pc2button.EnableWindow(false);
				m_erbutton.EnableWindow(false);
				m_xorbutton.EnableWindow(false);
				m_sbutton.EnableWindow(false);
				m_pbutton.EnableWindow(false);
				m_lfxorbutton.EnableWindow(false);
			}
		}
	}
	else
	{
		m_Rold=m_Rnew;
		m_Lold=m_Lnew;
		for(int i=0;i<32;i++)
		{
			bLold[i]=bLnew[i];
			bRold[i]=bRnew[i];
		}

		m_Lnew="";m_Rnew="";
		m_Round.Format("%d",DESRound);
		UpdateData(false);
		m_nextRound.EnableWindow(false);   //下一轮按钮不可点击
		m_ipbutton.EnableWindow(false);
		m_leftbutton.EnableWindow(true);
		m_pc2button.EnableWindow(false);
		m_erbutton.EnableWindow(false);
		m_xorbutton.EnableWindow(false);
		m_sbutton.EnableWindow(false);
		m_pbutton.EnableWindow(false);
		m_lfxorbutton.EnableWindow(false);
		
	}
}

void CDESEncrptionDlg::OnLeftButton() 
{
	if(DESRound==1)
	{
		if(m_OutputVar=="")
		{
			MessageBox("请填好密钥","warn",4);
		}
		else
		{
			bool b64[64];
			
			CString key=m_OutputVar;
			int len=m_OutputVar.GetLength();
			if(len<16)
			{
				MessageBox("请输入足够的字符,至少16个","警告",1);
			}
			else if(!Analysis(key,b64,64))
			{
				MessageBox("对不起,请重新输入有效密钥字符!","警告",1);
			}
			else
			{
				//DecimalToBinary(key,b64,64);
				Transfer(PC1,b64,b64dup,56);

				LeftMove(b64dup,iter[DESRound-1][1]);
				m_C=""; m_D="";
				for(int i=0;i<28;i++)
				{
					if(b64dup[i]==0)
						m_C+="0";
					else
						m_C+="1";
					if(b64dup[i+28]==0)
						m_D+="0";
					else
						m_D+="1";
					bCD[i]=b64dup[i];
					bCD[i+28]=b64dup[i+28];
				}
				UpdateData(false);
				m_ipbutton.EnableWindow(false);
				m_leftbutton.EnableWindow(false);
				m_pc2button.EnableWindow(true);
				m_erbutton.EnableWindow(false);
				m_xorbutton.EnableWindow(false);
				m_sbutton.EnableWindow(false);
				m_pbutton.EnableWindow(false);
				m_lfxorbutton.EnableWindow(false);
			}

		}
	}
	else
	{
		LeftMove(b64dup,iter[DESRound-1][1]);
		m_C=""; m_D="";
		for(int i=0;i<28;i++)
		{
			if(b64dup[i]==0)
				m_C+="0";
			else
				m_C+="1";
			if(b64dup[i+28]==0)
				m_D+="0";
			else
				m_D+="1";
			bCD[i]=b64dup[i];
			bCD[i+28]=b64dup[i+28];
		}
		UpdateData(false);
		m_ipbutton.EnableWindow(false);
		m_leftbutton.EnableWindow(false);
		m_pc2button.EnableWindow(true);
		m_erbutton.EnableWindow(false);
		m_xorbutton.EnableWindow(false);
		m_sbutton.EnableWindow(false);
		m_pbutton.EnableWindow(false);
		m_lfxorbutton.EnableWindow(false);
		
	}

}

void CDESEncrptionDlg::OnPC2Button() 
{
	Transfer(PC2,bCD,bK,48);
	m_K=BtoS(bK,48);
	UpdateData(false);
	m_ipbutton.EnableWindow(false);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(true);
	m_xorbutton.EnableWindow(false);
	m_sbutton.EnableWindow(false);
	m_pbutton.EnableWindow(false);
	m_lfxorbutton.EnableWindow(false);
}

void CDESEncrptionDlg::OnERButton() 
{
	
	Transfer(E,bRold,bER,48);                 //从R0得到E(R)
	m_ER=BtoS(bER,48);
	UpdateData(false);
	m_ipbutton.EnableWindow(false);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(false);
	m_xorbutton.EnableWindow(true);
	m_sbutton.EnableWindow(false);
	m_pbutton.EnableWindow(false);
	m_lfxorbutton.EnableWindow(false);
}

void CDESEncrptionDlg::OnXORButton() 
{
	xor48(bK,bER,bXOR,48);                   //得到K1 xor E(R)
	m_XOR=BtoS(bXOR,48);
	UpdateData(false);
	m_ipbutton.EnableWindow(false);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(false);
	m_xorbutton.EnableWindow(false);
	m_sbutton.EnableWindow(true);
	m_pbutton.EnableWindow(false);
	m_lfxorbutton.EnableWindow(false);
}

void CDESEncrptionDlg::OnSButton() 
{
	sixTofour(bXOR,bS);                      //六变四
	m_S=BtoS(bS,32);
	UpdateData(false);
	m_ipbutton.EnableWindow(false);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(false);
	m_xorbutton.EnableWindow(false);
	m_sbutton.EnableWindow(false);
	m_pbutton.EnableWindow(true);
	m_lfxorbutton.EnableWindow(false);
}

void CDESEncrptionDlg::OnPButton() 
{
	Transfer(P,bS,bF,32);                    //得到F(R,K)的值
	m_F=BtoS(bF,32);
	UpdateData(false);
	m_ipbutton.EnableWindow(false);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(false);
	m_xorbutton.EnableWindow(false);
	m_sbutton.EnableWindow(false);
	m_pbutton.EnableWindow(false);
	m_lfxorbutton.EnableWindow(true);
}

void CDESEncrptionDlg::OnLFXORButton() 
{
	xor48(bLold,bF,bRnew,32);
	for(int i=0;i<32;i++)
	{
		bLnew[i]=bRold[i];
	}
	m_Lnew=BtoS(bLnew,32);
	m_Rnew=BtoS(bRnew,32);
	UpdateData(false);
	DESRound++;
	m_nextRound.EnableWindow(true);

	CString cstring;
	CString head;
	cstring.Format("%d",(DESRound-1));
	head="R";
	head+=cstring;
	ROsign.SetWindowText(head);
	head.SetAt(0,'L');
	LOsign.SetWindowText(head);

	cstring.Format("%d",(DESRound));
	head="C";
	head+=cstring;
	Csign.SetWindowText(head);
	head.SetAt(0,'D');
	Dsign.SetWindowText(head);
	head.SetAt(0,'K');
	Ksign.SetWindowText(head);
	head.SetAt(0,'L');
	LNsign.SetWindowText(head);
	head.SetAt(0,'R');
	RNsign.SetWindowText(head);
	

	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;

	}
	m_ipbutton.EnableWindow(true);
	m_leftbutton.EnableWindow(false);
	m_pc2button.EnableWindow(false);
	m_erbutton.EnableWindow(false);
	m_xorbutton.EnableWindow(false);
	m_sbutton.EnableWindow(false);
	m_pbutton.EnableWindow(false);
	m_lfxorbutton.EnableWindow(false);
}

void CDESEncrptionDlg::OnnextRound()            //整体进行一轮加密
{
	if(m_InputVar=="")
	{
		MessageBox("请填好原文","warn",4);
	}
	else if(m_OutputVar=="")
	{
		MessageBox("请填好密钥","warn",4);
	}
	else
	{
		
		if(DESRound==1)
		{
			m_ResultEdit="";
			UpdateData(false);
			bool b64[64];
			bool b64dup1[64];
			DecimalToBinary(m_InputVar,b64,64);    //temp64 is the 0,1 representation of input
			Transfer(ip,b64,b64dup1,64);

			for(int i=0;i<32;i++)
			{
				bLold[i]=b64dup1[i];
			}
			for(i=0;i<32;i++)
			{
				bRold[i]=b64dup1[i+32];
			}
			m_Lold=BtoS(bLold,32);
			m_Rold=BtoS(bRold,32);
			
			UpdateData(false);
			
		
		}
		else
		{
			m_Rold=m_Rnew;
			m_Lold=m_Lnew;
			for(int i=0;i<32;i++)
			{
				bLold[i]=bLnew[i];
				bRold[i]=bRnew[i];
			}
			
			m_Lnew="";m_Rnew="";
			m_Round.Format("%d",DESRound);
			UpdateData(false);
		}

		if(DESRound==1)
		{
		
			bool b64[64];
			
			CString key=m_OutputVar;
			DecimalToBinary(key,b64,64);
			Transfer(PC1,b64,b64dup,56);
			LeftMove(b64dup,iter[DESRound-1][1]);
			m_C=""; m_D="";
			for(int i=0;i<28;i++)
			{
				if(b64dup[i]==0)
					m_C+="0";
				else
					m_C+="1";
				if(b64dup[i+28]==0)
					m_D+="0";
				else
					m_D+="1";
				bCD[i]=b64dup[i];
				bCD[i+28]=b64dup[i+28];
			}
			UpdateData(false);
		}
		else
		{
			LeftMove(b64dup,iter[DESRound-1][1]);
			m_C=""; m_D="";
			for(int i=0;i<28;i++)
			{
				if(b64dup[i]==0)
					m_C+="0";
				else
					m_C+="1";
				if(b64dup[i+28]==0)
					m_D+="0";
				else
					m_D+="1";
				bCD[i]=b64dup[i];
				bCD[i+28]=b64dup[i+28];
			}
			UpdateData(false);
		}
      
		Transfer(PC2,bCD,bK,48);                 //得到K1
		m_K=BtoS(bK,48);
		UpdateData(false);

		Transfer(E,bRold,bER,48);                 //从R0得到E(R)
		m_ER=BtoS(bER,48);
		UpdateData(false);

		xor48(bK,bER,bXOR,48);                   //得到K1 xor E(R)
		m_XOR=BtoS(bXOR,48);
		UpdateData(false);

		sixTofour(bXOR,bS);                      //六变四
		m_S=BtoS(bS,32);
		UpdateData(false);

		Transfer(P,bS,bF,32);                    //得到F(R,K)的值
		m_F=BtoS(bF,32);
		UpdateData(false);
		

		xor48(bLold,bF,bRnew,32);               //得到R1
		for(int i=0;i<32;i++)
		{
			bLnew[i]=bRold[i];
		}
		m_Lnew=BtoS(bLnew,32);                 //得到L1
		m_Rnew=BtoS(bRnew,32);
		UpdateData(false);
		
		DESRound++;
		CString cstring;
		CString head;
		cstring.Format("%d",(DESRound-1));
		head="R";
		head+=cstring;
		ROsign.SetWindowText(head);
		head.SetAt(0,'L');
		LOsign.SetWindowText(head);

		cstring.Format("%d",(DESRound));
		head="C";
		head+=cstring;
		Csign.SetWindowText(head);
		head.SetAt(0,'D');
		Dsign.SetWindowText(head);
		head.SetAt(0,'K');
		Ksign.SetWindowText(head);
		head.SetAt(0,'L');
		LNsign.SetWindowText(head);
		head.SetAt(0,'R');
		RNsign.SetWindowText(head);

⌨️ 快捷键说明

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