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

📄 desdlg.cpp

📁 很不错的一个加密程序 不信的人可以自己下载
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		MessageBox("请输入8位明文", "友情提示");
		return;
	}
	if(m_key.GetLength()!=8)
	{
		MessageBox("请输入8位密文", "友情提示");
		return;
	}
	PlaySound("BEGIN",  AfxGetResourceHandle(),
		SND_RESOURCE|SND_ASYNC|SND_NODEFAULT);
	// char plaintext[8];
	// strcpy(plaintext,m_old);

	// 让解密按钮有效;
	GetDlgItem(IDC_DECRYPT)->EnableWindow(true);
	CString str;			// 该字符串存储ASCII码
	//////////////////////////////////////////////////////////////////////////
	// 初始化数组元素清0
	memset(L0, 0, 32);		
	memset(R0, 0, 32);
	
	memset(k1, 0, 48);
	memset(Kc0, 0, 28);	
	memset(Kd0, 0, 28);
	
	memset(re, 0, 48);
	memset(old, 0, 64);
	
	memset(s, 0, 48);
	//////////////////////////////////////////////////////////////////////////
	// 此处开始加密
	m_new="";		//先将密文清空	
	
	//////////////////////////////////////////////////////////////////////////
	/// 此处对明文处理,将对应的ASCII码转化为二进制	
	int flag=true;
	for(int i=0; i<8; i++)
	{
		char ch=m_old.GetAt(i);
		if(ch&0x80&&flag)
		{
			MessageBox("含有中文字符,加密错误不负责任!", "友情提示");
			flag=false;
			//return;
		}
		memset(tmp, 0, 8);
		for(int j=0; j<8; j++)
		{
			tmp[j]=(ch%2+2)%2;
			ch/=2;
		}
		for(j=7; j>=0; j--)
		{
			old[i*8+7-j]=tmp[j];
		}	
	}
	
	// 此处显示明文二进制
	m_oldbin="";
	for(i=0; i<64; i++)	
	{
		str.Format("%d", old[i]);
		m_oldbin+=str;
	}
	GetDlgItem(IDC_EDIT5)->SetWindowText(m_oldbin);
	
	for(i=0; i<32; i++)
	{	
		L0[i]=old[IP_Table[i]-1];			/// 获得L0共32位
		R0[i]=old[IP_Table[i+32]-1];		/// 获得R0共32位
	}
	
	//////////////////////////////////////////////////////////////////////////
	/// 此处开始对C0,D0处理
	for(i=0; i<8; i++)
	{
		memset(tmp, 0, 8);
		char ch=m_key.GetAt(i);
		if(ch&0x80)
		{
			MessageBox("含有中文字符,加密失败", "友情提示");
			return;
		}
		for(int j=0; j<8; j++)
		{
			tmp[j]=ch%2;
			ch/=2;
		}
		for(j=7; j>=0; j--)
		{
			k[i*8+7-j]=tmp[j];
		}
	}
	
	for(i=0; i<28; i++)
	{
		Kc0[i]=k[PC1_Table[i]-1];			/// 获得c0共28位
		Kd0[i]=k[PC1_Table[i+28]-1];		/// 获得d0共28位
	}
	
	//////////////////////////////////////////////////////////////////////////
	/// 此处开始16迭代算法
	isDecrypt=false;
	for(i=1; i<=16; i++)
	{
		CDESDlg::Iterate(i);
	}

	//////////////////////////////////////////////////////////////////////////
	// 最后一次生成的L16与R16调换位置装入密文字符串里
	int miwen[64];
	memset(miwen, 0, 64);
	// 逆初始置换,真它MOTHER的麻烦!
	int mitmp[64];
	memset(mitmp, 0, 64);
	for(i=0; i<32; i++)	
	{
		mitmp[i]=R0[i];
		mitmp[32+i]=L0[i];
		//交换L0,R0的值
		L0[i]=mitmp[i];
		R0[i]=mitmp[i+32];
	}

	for(i=0; i<64; i++)	
	{
		miwen[i]=mitmp[IPR_Table[i]-1];
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 将密文2进制存入m_keybin
	str="";
	m_keybin="";
	for(i=0; i<64; i++)	
	{
		str.Format("%d", miwen[i]);
		m_keybin+=str;
	}
	GetDlgItem(IDC_EDIT6)->SetWindowText(m_keybin);

	//////////////////////////////////////////////////////////////////////////
	// 将密文ASCII码放入编辑框里面去
	m_new="";
	for(i=0; i<8; i++)
	{
		int tmp=0;
		tmp+=miwen[8*i];
		for(int j=1; j<8; j++)
		{
			tmp*=2;
			tmp+=miwen[i*8+j];
		}
		str.Format("%c", tmp);
		m_new+=str;
	}
	GetDlgItem(IDC_EDIT3)->SetWindowText(m_new);
}

void CDESDlg::OnDecrypt() 
{
	PlaySound("BEGIN",  AfxGetResourceHandle(),
		SND_RESOURCE|SND_ASYNC|SND_NODEFAULT);
	m_listdata.DeleteAllItems();		//清空列表项目
	//////////////////////////////////////////////////////////////////////////
	///  重新开始16次迭代算法
	isDecrypt=true;
	int i;
	for(i=16; i>=1; i--)
	{
		CDESDlg::Iterate(i);
	}

	//////////////////////////////////////////////////////////////////////////
	// 最后一次生成的L16<->R16调换位置
	int minwen[64];
	memset(minwen, 0, 64);
	// 逆初始置换,真它MOTHER的麻烦!
	int mintmp[64];
	memset(mintmp, 0, 64);

	for(i=0; i<32; i++)	
	{
		mintmp[i]=R0[i];
		mintmp[32+i]=L0[i];
	}
	
	for(i=0; i<64; i++)	
	{
		minwen[i]=mintmp[IPR_Table[i]-1];
	}

	//////////////////////////////////////////////////////////////////////////
	// 将密文ASCII码放入编辑框里面去
	CString str;
	m_Last="";
	for(i=0; i<8; i++)
	{
		int tmp=0;
		tmp+=minwen[8*i];
		for(int j=1; j<8; j++)
		{
			tmp*=2;
			tmp+=minwen[i*8+j];
		}
		str.Format("%c", tmp);
		m_Last+=str;
	}
	UpdateData(false);
	// 让解密按钮无效;
	GetDlgItem(IDC_DECRYPT)->EnableWindow(false);
}

void CDESDlg::Iterate(int numOfIteration)
{
	//////////////////////////////////////////////////////////////////////////
	/// 此处迭代生成子密钥ki
	int j=2;					// 移位次数
	if(	numOfIteration==1||numOfIteration==2||
		numOfIteration==9||numOfIteration==16)
	{
		j=1;
	}
	//////////////////////////////////////////////////////////////////////////
	//如果为解密,迭代移位的次序变换相反方向
	if(isDecrypt)
	{
		if(numOfIteration==16)
		{
			j=0;
		}
		else if(numOfIteration==15||numOfIteration==8||numOfIteration==1)
		{
			j=-1;
		}
		else
		{
			j=-2;
		}
	}
	
	int Kctmp[28], Kdtmp[28];	//  C0, D0中间传递数据
	memset(Kctmp, 0, 28);
	memset(Kdtmp, 0, 28);
	for(int i=0; i<28; i++)
	{
		Kctmp[i]=Kc0[(i+j+28)%28];
		Kdtmp[i]=Kd0[(i+j+28)%28];
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 将KCTMP, KDTMP的数据存入KC,KD中去
	for(i=0; i<28; i++)
	{
		Kc0[i]=Kctmp[i];
		Kd0[i]=Kdtmp[i];
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 生成子密钥Ki,存储到数组k1[48]中去
	int ktmp[56];
	memset(ktmp, 0, 56);
	for(i=0; i<28; i++)
	{
		ktmp[i]=Kc0[i];
		ktmp[i+28]=Kd0[i];
	}
	
	memset(k1, 0, 48);
	for(i=0; i<48; i++)
	{
		k1[i]=ktmp[PC2_Table[i]-1];
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 将Ri-1扩充成48位并与Ki相加并模2
	memset(re, 0, 48);
	for(i=0; i<48; i++)
	{	
		re[i]=(R0[E_Table[i]-1]+k1[i])%2;
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 	分成8组, 每组6位,有一个二维数组s[8][6]存储
	for(i=0; i<6; i++)
	{
		for(int j=0; j<8; j++)
		{
			s[j][i]=re[6*j+i];
		}
	}
	
	//////////////////////////////////////////////////////////////////////////
	// 以下通过8个S盒得到8个S数并存到S[8]中S_Box[8][4][16] 
	memset(s0, 0, 8);
	for(i=0; i<8; i++)
	{
		s0[i]=S_Box[i][s[i][5]+s[i][0]*2][s[i][1]*8+s[i][2]*4+s[i][3]*2+s[i][4]];
	}
	
	memset(stmp, 0, 8);
	memcpy(stmp, s0, sizeof(s0));
	//////////////////////////////////////////////////////////////////////////
	// 将8个数分别转换成2进制,再存入到frk[32]
	int f[32];
	memset(f, 0, 32);
	for(i=0; i<8; i++)
	{
		int tmp[4];
		memset(tmp, 0, 4);
		for(int j=0; j<4; j++)
		{
			tmp[j]=s0[i]%2;
			s0[i]/=2;
		}
		for(j=0; j<4; j++)
		{
			f[4*i+j]=tmp[3-j];
		}
	}
	
	// 经过P变换存入frk[32]
	for(i=0; i<32; i++)
	{
		frk[i]=f[P_Table[i]-1];
	}
	
	int Ltmp[32], Rtmp[32];
	memset(Ltmp, 0, 32);
	memset(Rtmp, 0, 32);
	
	for(i=0; i<32; i++)
	{
		Ltmp[i]=R0[i];
		Rtmp[i]=(L0[i]+frk[i])%2;
	}
	
	// 最后将数据存入L0,RO里面去
	for(i=0; i<32; i++)
	{
		L0[i]=Ltmp[i];
		R0[i]=Rtmp[i];
	}
	
	CDESDlg::SaveToList();
	//////////////////////////////////////////////////////////////////////////
	// 16次迭代算法结束,真累呀^_^
}

⌨️ 快捷键说明

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