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

📄 cryptographydlg.cpp

📁 实现了凯撒、Playfair维吉尼亚和置换算法的MFC加解密程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_StrCipInPut.Insert(Length,'x');
		Length = Length+1;
	}

	//将字母对换成相应的密文
	for (int x = 0,y = 1;y<Length;x = x+2,y = y+2)
	{

		char ch1=m_StrCipInPut.GetAt(x);
		char ch2=m_StrCipInPut.GetAt(y);

		//查找字母对在矩阵中的位置
		for (m = 0;m < 5;m++)
		{
			for (n = 0;n < 5;n++)
			{
				if(str[m].GetAt(n) ==ch1 )
				{
					p = m;
					q = n;
				}
				if (str[m].GetAt(n) ==ch2 )
				{
					row = m;
					col = n;
				}
			}
		}

		//同行取右边
		if (p == row)
		{
			q = (q+1)%5;
			col = (col+1)%5;
			str1 += str[p].GetAt(q);
			str1 += str[row].GetAt(col);
		}

		//同列取下边
		else if (q == col)
		{
			p = (p+1)%5;
			row = (row+1)%5;
			str1 += str[p].GetAt(q);
			str1 += str[row].GetAt(col);
		}

		//其他取交叉
		else
		{
			str1 +=str[p].GetAt(col);
			str1 +=str[row].GetAt(q);
		}
	}
	m_StrCipInPut = str1;
	UpdateData(FALSE);
}
void CCryptographyDlg::PlayfairDecrypt()
{
	UpdateData(TRUE);
	m_StrPlainTextOut = "";

	//构建Playfair密表
	CString str[20];
	char FileArray[5];
	memset(&FileArray,0,5);
	ifstream myFile;
	int i = 0,j = 0,m = 0,n = 0,l = 0,q = 0,p = 0,rom = 0,low = 0;
	myFile.open("Playfair.txt",ios_base::in);						//读取Playfair密表
	while(myFile.getline(FileArray,20)&&i<5)						
	{
		str[i].Format("%s",FileArray);
		i++;
	}
	myFile.close();
	
	CString str1,str2;
	int Length = m_StrCipInPut.GetLength();
  
	//将密文字母对转换为明文之母对
	for (int x = 0,y = 1;y<Length;x = x+2,y = y+2)
	{

		//查找密文在矩阵中的位置
		for (m = 0;m < 5;m++)
		{
			for (n = 0;n < 5;n++)
			{
				if(str[m][n] == m_StrCipInPut.GetAt(x))
				{
					p = m;q = n;
				}
				if (str[m][n] == m_StrCipInPut.GetAt(y))
				{
					rom = m;low = n;
				}
			}
		}

		//同行取右边
		if (p == rom)
		{
			q = ((q-1)+5)%5;
			low = ((low-1)+5)%5;
			str1 += str[p][q];
			str1 += str[rom][low];
		}

		//同列取下边
		else if (q == low)
		{
			p = ((p-1)+5)%5;
			rom = ((rom-1)+5)%5;
			str1 += str[p][q];
			str1 += str[rom][low];
		}

		//其他取交叉
		else
		{
			str1 +=str[p][low];
			str1 +=str[rom][q];
		}
	}
	m_StrPlainTextOut = str1;
	
	
	UpdateData(FALSE);
	
}

//Vigenere密码
void CCryptographyDlg::Vigenere()
{
	UpdateData(TRUE);
	m_StrCipInPut = "";
	char FileArray[1000];
	memset(&FileArray,0,1000);
	ifstream myFile;
	int i = 0,j = 0,k = 0,l = 0,m = 0;
	myFile.open("Vigenere.txt",ios_base::in);						//读取vigenere密表
	while(myFile.getline(FileArray,1000)&&i<26)						
	{
		pass[i] = FileArray;
		i++;
	}
	myFile.close();
	CString plainttext ="abcdefghijklmnopqrstuvwxyz";				
	int Length = m_StrPlaintTextInPut.GetLength();
	CString array[1000] = {""},array1[26] = {""};					//array[]保存明文
	while (j<Length)												//获取明文
	{
		array[j] = m_StrPlaintTextInPut.GetAt(j);	
		j++;
	}
	if (m_StrPass =="")												//获取密钥
	{
		AfxMessageBox("请输入密钥");
		return;
	}
	int L = m_StrPass.GetLength();
	while (k<L)														//array1[]保存密钥
	{
		array1[k] = m_StrPass.GetAt(k);
		k++;
	}
	for (j = 0,k = 0;j<Length;j++,k++)
	{
		k = k%L;
		l = plainttext.Find(array[j]);
		m = plainttext.Find(array1[k]);		
		m_StrCipInPut +=pass[m].GetAt(l);							//在vigenere表中查找对应的字母
	}
	UpdateData(FALSE);
}

void CCryptographyDlg::VigenereDecrypt()
{
	UpdateData(TRUE);
	m_StrPlainTextOut = "";
	char FileArray[1000];
	memset(&FileArray,0,1000);
	int i = 0,j = 0,k = 0,l = 0,m = 0,o = 0,p = 0;
	ifstream myFile;
	myFile.open("vigtable.txt",ios_base::in);	
	while(myFile.getline(FileArray,1000)&&i<26)
	{
		pass[i] = FileArray;
		i++;
	}
	myFile.close();

	CString plainttext ="abcdefghijklmnopqrstuvwxyz";			
	int Length = m_StrPlaintTextInPut.GetLength();
	CString array[1000] = {""},array1[26] = {""};
	
	int L = m_StrPass.GetLength();
	while (k<L)														
	{
		array1[k] = m_StrPass.GetAt(k);
		k++;
	}
	
	for (j = 0,k = 0;j<Length;j++,k++)
	{
		k = k%L;
		m = plainttext.Find(array1[k]);								//获取密钥行号		
		for (int n = 0;n<26;n++)									//根据行号来查找对应的密文字母,并记录列号
		{
			if (pass[m].GetAt(n) == m_StrCipInPut.GetAt(j))
			{
				o  = n;
			}
		}
		m_StrPlainTextOut +=plainttext.GetAt(o);					//O即为列号
	}
	UpdateData(FALSE);
}

//置换密码
void CCryptographyDlg::Permutation ()
{
	UpdateData(TRUE);
	m_StrCipInPut = "";
	int Length = m_StrPlaintTextInPut.GetLength();					//获取明文的长度
	if (m_StrPass == "")
	{
		AfxMessageBox("请输入密钥");
		return;
	}
	int L = m_StrPass.GetLength();									//获取密钥的长度和矩阵的列数
	int i = 0, j= 0,p = 0,q = 0,r = 0;
	CString array[100][100] = {""};
	
	//若明文长度小于密钥长度
	if (Length<L)													
	{
		for (int n = 0;n < Length; n++)
		{
			if (p == Length)
			{
				break;
			}
			array[0][n] = m_StrPlaintTextInPut.GetAt(p);			//将明文保存到array[]中
			p++;
		}
		char v = '1';												//密钥长度为8,从1开始
		while (v<'8')
		{
			q = m_StrPass.Find(v);
			m_StrCipInPut +=array[0][q];
			v++;
		}
		
	}

	//明文长度大于密钥长度
	else
	{
		j = (int)(Length/L)+1;										//构造矩阵的行数	
		for (int k = 0;k<j;k++)
		{
			for (int n = 0;n < L;n++)
			{
				if (p == Length)
				{
					break;
				}
				array[k][n] = m_StrPlaintTextInPut.GetAt(p);
				p++;
			}
		}
		
		char v = '1';
		while (v <'8')
		{
			q = m_StrPass.Find(v);
			r = 0;
			while (r<j)
			{
				m_StrCipInPut +=array[r][q];
				r++;
			}		
			v++;
		}
	}
	UpdateData(FALSE);
}
void CCryptographyDlg::PermutationDecrypt()
{
	UpdateData(TRUE);
	m_StrPlainTextOut = "";
	int Length = m_StrCipInPut.GetLength();			//获取密文的长度
	if (m_StrPass == "")
	{
		AfxMessageBox("请输入密钥");
		return;
	}
	int L = m_StrPass.GetLength();					//获取密钥的长度和矩阵的列数
	int i = 0, j= 0,p = 0,q = 0,r = 0;
	CString array[100][100] = {""};
	
	//若明文长度小于密钥长度
	if (Length<L)
	{
		int b = 0;
		char v = '1';
		while (v<'8')
		{
			q = m_StrPass.Find(v);
			int k = 0;
			for (;k<1,b<Length;b++,k++)
			{
				if (k == 1)
				{
					break;
				}
				array[0][q] = m_StrCipInPut.GetAt(b);
			}
			v++;
		}
		for (int n = 0;n < L;n++)
		{
			if (p == L)
			{
				break;
			}
			m_StrPlainTextOut +=array[0][n];
			p++;
		}
	}

	//明文长度大于密钥长度
	else
	{
		j = (int)(Length/L)+1;				//构造矩阵的行数
		int t = Length%L;
		int b = 0;
		char v = '1';
		while (v <'8')
		{
			q = m_StrPass.Find(v);			//从小到大找出对应的列号
			r = 0;	
			for (;b<L,r<j;b++,r++)
			{	
				if(r == j-1&&q>t)
				{
					break;
				}
				array[r][q] = m_StrCipInPut.GetAt(b);
			}
			v++;
		}

		//明文保存
		for (int k = 0;k<j;k++)
		{
			for (int n = 0;n < L;n++)
			{
				if (p == Length)
				{
					break;
				}
				m_StrPlainTextOut +=array[k][n];
				p++;
			}
		}
	}
	UpdateData(FALSE);
}

⌨️ 快捷键说明

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