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

📄 desdlg.cpp

📁 输入任意长明文及8位密钥
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    r=m_miwenstring.GetBuffer(0);
	flag1=m_miwenstring.GetLength();
	suijixing(r,flag1);
}

void CDESDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	int flag1,flag2,temp,i,j;
	char *p,*q,*r;
	char duankuai[64];/*存放倒数64位密文*/
	char tempchar[64];/*存放每轮解密64位明文*/
	char buf[65];/*由数组转换至CString中转空间*/
	char miwen[64];/*存放每轮解密64位密文*/
	char c[2];
	char temp1[8];
    CString str;

    UpdateData();
	if(m_miwenstring.GetLength()==0)
         MessageBox("请输入密文","提示",MB_OK);	
	else
	{
		if(m_miyaostring.GetLength()==0)
	    	 MessageBox("请输入密钥","提示",MB_OK); 
        else
		{
            if(m_miyaostring.GetLength()!=8)
	            MessageBox("密钥长度错误,请重新输入8位密钥","提示",MB_OK);
			else
			{
                p=m_miyaostring.GetBuffer(0);
                key_creat(p);
				q=m_miwenstring.GetBuffer(0);
				flag1=m_miwenstring.GetLength();
				temp=flag1%64;
				flag1-=temp;/*计数不需短块处理的密文位数*/
				flag2=0;/*计数不需短块处理的解密次数*/
				str="";
				if(temp!=0)
				{
					MessageBox("需要进行短块处理","提示",MB_OK);
			    	for(i=0;i<64;i++)
			    		duankuai[i]=q[flag1-64+i];
			    	DES(duankuai,tempchar,0);
			    	for(i=0;i<64;i++)
			    		buf[i]=tempchar[i];
		    		buf[64]='\0';
			    	m_miwenstring.Delete(flag1-64,64);
			    	m_miwenstring+=buf;
				}
				while(flag1)
				{
	            	for(j=0;j<64;j++)
						miwen[j]=q[j+flag2*64];
			    	flag2++;
					flag1-=64;
					DES(miwen,tempchar,0);
					for(i=0;i<64;i++)
						buf[i]=tempchar[i];
					buf[64]='\0';
					str+=buf;
				}
				str+=m_miwenstring.Mid(flag2*64,temp);
				r=str.GetBuffer(0);
				flag1=str.GetLength();
				flag2=0;
				for(i=0;i<flag1/8;i++)
				{
					for(j=0;j<8;j++)
						temp1[j]=r[j+flag2*8]-48;
					c[0]=temp1[0]*128+temp1[1]*64+temp1[2]*32+temp1[3]*16+temp1[4]*8+temp1[5]*4+temp1[6]*2+temp1[7];
					c[1]='\0';
					m_mingwenstring+=c;
					flag2++;
				}
				UpdateData(FALSE);
			}
		}
	}
}

void CDESDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
    m_mingwenstring="";
	m_miyaostring="";
	m_miwenstring="";
	m_0="";
	m_1="";
	m_00="";
	m_01="";
	m_10="";
	m_11="";
	m_000="";
	m_001="";
	m_010="";
	m_011="";
	m_100="";
	m_101="";
	m_110="";
	m_111="";
	UpdateData(FALSE);
}

void CDESDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	char buf[3];
	m_0="";
	m_1="";
	m_00="";
	m_01="";
	m_10="";
	m_11="";
	m_000="";
	m_001="";
	m_010="";
	m_011="";
	m_100="";
	m_101="";
	m_110="";
	m_111="";
	buf[0]=suiji[0][0];
	buf[1]=suiji[0][1];
	buf[2]='\0';
	m_0+=buf;
	buf[0]=suiji[1][0];
	buf[1]=suiji[1][1];
	buf[2]='\0';
	m_1+=buf;
	buf[0]=suiji[2][0];
	buf[1]=suiji[2][1];
	buf[2]='\0';
	m_00+=buf;
	buf[0]=suiji[3][0];
	buf[1]=suiji[3][1];
	buf[2]='\0';
	m_01+=buf;
	buf[0]=suiji[4][0];
	buf[1]=suiji[4][1];
	buf[2]='\0';
	m_10+=buf;
	buf[0]=suiji[5][0];
	buf[1]=suiji[5][1];
	buf[2]='\0';
	m_11+=buf;
	buf[0]=suiji[6][0];
	buf[1]=suiji[6][1];
	buf[2]='\0';
	m_000+=buf;
	buf[0]=suiji[7][0];
	buf[1]=suiji[7][1];
	buf[2]='\0';
	m_001+=buf;
	buf[0]=suiji[8][0];
	buf[1]=suiji[8][1];
	buf[2]='\0';
	m_010+=buf;
	buf[0]=suiji[9][0];
	buf[1]=suiji[9][1];
	buf[2]='\0';
	m_011+=buf;
	buf[0]=suiji[10][0];
	buf[1]=suiji[10][1];
	buf[2]='\0';
	m_100+=buf;
	buf[0]=suiji[11][0];
	buf[1]=suiji[11][1];
	buf[2]='\0';
	m_101+=buf;
	buf[0]=suiji[12][0];
	buf[1]=suiji[12][1];
	buf[2]='\0';
	m_110+=buf;
	buf[0]=suiji[13][0];
	buf[1]=suiji[13][1];
	buf[2]='\0';
	m_111+=buf;
	UpdateData(FALSE);
}

void Byte_To_Bit(char *str1,char *str2)
{
    int i;
    unsigned char c;

    for(i=0;i<8;i++)
    {
       c=*(str1+i);
       str2[i*8]=(c>>7)%2+48;
       str2[i*8+1]=(c>>6)%2+48;
       str2[i*8+2]=(c>>5)%2+48;
       str2[i*8+3]=(c>>4)%2+48;
       str2[i*8+4]=(c>>3)%2+48;
       str2[i*8+5]=(c>>2)%2+48;
       str2[i*8+6]=(c>>1)%2+48;
       str2[i*8+7]=c%2+48;
    }
}

void key_creat(char *p)
{

	int i,flag;
	char mainkey[64];
	char key56[56];
	char c[28],d[28],cc[28],dd[28];
	char temp[56];

	Byte_To_Bit(p,mainkey);
    pc1_trans(mainkey,key56);
    for(i=0;i<28;i++)
	{
        c[i]=key56[i];
        d[i]=key56[i+28];
	}
	for(flag=0;flag<16;flag++)
	{
	    for(i=0;i<28;i++)
		{
		    cc[i]=c[(i+28-moveleft[flag])%28];
			dd[i]=d[(i+28-moveleft[flag])%28];
		}
        for(i=0;i<28;i++)
	   	{
	      	temp[i]=cc[i];
	        temp[i+28]=dd[i];
	   	}
       	pc2_trans(temp,key[flag]);
   	}    
}

void pc1_trans(char *str1,char *str2)
{
    int i=0;
	for(;i<56;i++)
		 str2[i]=str1[pc1[i]-1];
}

void pc2_trans(char *str1,char *str2)
{
	int i=0;
	for(;i<48;i++)
		str2[i]=str1[pc2[i]-1];
}

void DES(char *str1,char *str2,int mode)
{
    int i=0,j;
    char ip_buf1[64];/*IP置换后*/
	char ip_buf2[64];/*IP逆置换前*/
    char L[17][32];/*L[i]*/
    char R[17][32];/*R[i]*/

	ip_trans(str1,ip_buf1);
	for(i=0;i<32;i++)
	{      
		L[0][i]=ip_buf1[i];     /*初始化L0*/
        R[0][i]=ip_buf1[i+32];  /*初始化R0*/
	}
    if(mode==1)/*加密模式*/
	{
       for(i=0;i<16;i++)
	   {
        	for(j=0;j<32;j++)
	           L[i+1][j]=R[i][j];
	        G_fuction(R[i],R[i+1],i);
	   }
	}
	if(mode==0)/*解密模式*/
	{
       for(i=0;i<16;i++)
	   {
        	for(j=0;j<32;j++)
	           L[i+1][j]=R[i][j];
	        G_fuction(R[i],R[i+1],15-i);
	   }
	}
	for(i=0;i<32;i++)
	{
		ip_buf2[i]=R[15][i];
		ip_buf2[i+32]=L[15][i];
	}
	ip_trans_ni(ip_buf2,str2);
}

void ip_trans(char *str1,char *str2)
{
    int i=0;
	for(;i<64;i++)
		str2[i]=str1[ip[i]-1];
}
void ip_trans_ni(char *str1,char *str2)
{
	int i=0;
	for(;i<64;i++)
		str2[i]=str1[ip_ni[i]-1];
}

void G_fuction(char *str1,char *str2,int integer)
{
	int i,flag;
	int x,y;/*定位S盒中的位置*/
	int temp;/*通过定位从S盒中取出的值*/
	int value[6];
	char E_expand[48];/*E扩展后*/
	char P_temp[32];/*P置换前*/
	char C[4];/*临时存储经过S盒得到的四位值*/
	int buf[4];/*存temp的二进制值*/
    
	for(i=0;i<48;i++)
	   E_expand[i]=str1[E[i]-1];
    xor(E_expand,key[integer],48);
	for(flag=0;flag<8;flag++)
	{
		for(i=0;i<6;i++)
		{
			if(E_expand[i+flag*6]=='0')
				value[i]=0;
			else
				value[i]=1;
		}
		x=value[0]*2+value[5];
		y=value[1]*8+value[2]*4+value[3]*2+value[4];
		temp=S_box[flag][x*16+y];
		for(i=0;i<4;i++)
			buf[3-i]=(temp>>i)%2;
		for(i=0;i<4;i++)
		{
			if(buf[i]==0)
				C[i]='0';
			else
				C[i]='1';
		}
		for(i=0;i<4;i++)
			P_temp[i+flag*4]=C[i];
	}
	P_dataex(P_temp,str2);
}

void xor(char *str1,char *str2,int length)
{
    int i;
    for(i=0;i<length;i++)
        if(str1[i]==str2[i])  
            str1[i]='0';
        else str1[i]='1';
}

void P_dataex(char *str1,char *str2)
{
	int i;
	for(i=0;i<32;i++)
		str2[i]=str1[P[i]-1];
}

void suijixing(char *str,int num)
{
   int flag[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int rate[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
   int i,temp,total1,total2;
   for(i=0;i<num;i++)
   {
	   if(str[i]=='0')
		   flag[0]++;
	   else
		   flag[1]++;
	   if(str[i]=='0'&&str[i+1]=='0')
		   flag[2]++;
	   if(str[i]=='0'&&str[i+1]=='1')
		   flag[3]++;
	   if(str[i]=='1'&&str[i+1]=='0')
		   flag[4]++;
	   if(str[i]=='1'&&str[i+1]=='1')
		   flag[5]++;
	   if(str[i]=='0'&&str[i+1]=='0'&&str[i+2]=='0')
		   flag[6]++;
	   if(str[i]=='0'&&str[i+1]=='0'&&str[i+2]=='1')
		   flag[7]++;
	   if(str[i]=='0'&&str[i+1]=='1'&&str[i+2]=='0')
		   flag[8]++;
	   if(str[i]=='0'&&str[i+1]=='1'&&str[i+2]=='1')
		   flag[9]++;
	   if(str[i]=='1'&&str[i+1]=='0'&&str[i+2]=='0')
		   flag[10]++;
	   if(str[i]=='1'&&str[i+1]=='0'&&str[i+2]=='1')
		   flag[11]++;
	   if(str[i]=='1'&&str[i+1]=='1'&&str[i+2]=='0')
		   flag[12]++;
	   if(str[i]=='1'&&str[i+1]=='1'&&str[i+2]=='1')
		   flag[13]++;
   }  
   total1=flag[2]+flag[3]+flag[4]+flag[5];
   total2=flag[6]+flag[7]+flag[8]+flag[9]+flag[10]+flag[11]+flag[12]+flag[13];
   for(i=0;i<2;i++)
	   rate[i]=(flag[i]*100)/num;
   for(i=2;i<6;i++)
	   rate[i]=(flag[i]*100)/total1;
   for(i=6;i<14;i++)
	   rate[i]=(flag[i]*100)/total2;
   for(i=0;i<14;i++)
   {
	   temp=rate[i];
	   suiji[i][0]=(temp/10)%10+48;
	   suiji[i][1]=temp%10+48;
   }
 }   


⌨️ 快捷键说明

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