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

📄 myfuncs.cpp

📁 自己编写的playfair加密/解密完整源程序.是用VC6 MFC编写的.Windows运行界面.可在Microsoft Visual C++ 6.0集成开发环境下直接编译运行.
💻 CPP
字号:
#include<stdafx.h>

CString keyMtx[5][5];//密钥矩阵

/*明文两两分组,去除连续相同的字符
  参数: plain-明文
        pExpand-分组后的明文
 */
void plainExpand(CString plain,CString & pExpand)
{
	plain.Replace('J','I'); //I,J当作一个字符
	for(int i=0;i<plain.GetLength()-1;i++)
	{
		if(plain[i]!=plain[i+1])	//如果连续字符不同,原样读出
		{
			pExpand=pExpand+plain.Mid(i,2);
			i++;
		}else				//如果连续字符相同,用X字符分隔
			pExpand=pExpand+plain[i]+'X';
	}
	if(i==plain.GetLength()-1)		//处理只剩一个字符的情况
		pExpand=pExpand+plain.GetAt(i)+'X';
}

/*根据输入密钥排列密钥矩阵
  参数: key-密钥字符串
  重排后的密钥矩阵为keyMtx(全局变量).
 */
void keyMtxGen(CString key)
{
	key.Replace('J','I');    //I,J当作一个字符
	key=key+"ABCDEFGHIKLMNOPQRSTUVWXYZ";
	CString tmp="";
	for(int i=0;i<key.GetLength();i++)
		if(tmp.Find(key[i])==-1)
			tmp=tmp+key[i];
	int k=0;
	for(i=0;i<5;i++)	//密钥重排成矩阵形式
		for(int j=0;j<5;j++)
			keyMtx[i][j]=tmp[k++];
}

/*playfair加密
  参数: pExpand-分组后的明文
        cipher-密文
 */
void playfairEnc(CString pExpand,CString & cipher)
{
	CString C1,C2,CC1,CC2;		//两个明文字符及对应的密文字符
	int row1,col1,row2,col2;	//两个明文字符的位置

	for(int i=0;i<pExpand.GetLength()-1;i+=2)
	{
		C1=pExpand[i];
		C2=pExpand[i+1];
		for(int m=0;m<5;m++)	//查找两个字符的位置
			for(int n=0;n<5;n++)
				if(keyMtx[m][n]==C1) {row1=m;col1=n;}
				else if(keyMtx[m][n]==C2)	{row2=m;col2=n;}
		if(row1==row2)		//同行取右面
		{
			CC1=keyMtx[row1][col1+1>4?0:col1+1];
			CC2=keyMtx[row2][col2+1>4?0:col2+1];
		}else if(col1==col2)	//同列取下面
		{
			CC1=keyMtx[row1+1>4?0:row1+1][col1];
			CC2=keyMtx[row2+1>4?0:row2+1][col2];
		}else			//交叉取另一条对角线
		{
			CC1=keyMtx[row1][col2];
			CC2=keyMtx[row2][col1];
		}
		cipher=cipher+CC1+CC2;
	}

}

/*playfair解密
  参数: cipher-密文
        plain-解密出的明文
 */
void playfairDec(CString cipher,CString & plain)
{
	CString C1,C2,CP1,CP2;		//两个密文字符及对应的明文字符
	int row1,col1,row2,col2;	//两个密文字符的位置
	CString tmp="";	//解密出的分组明文(包含插入的X字母)

	for(int i=0;i<cipher.GetLength()-1;i+=2)
	{
		C1=cipher[i];
		C2=cipher[i+1];
		for(int m=0;m<5;m++)	//查找两个字符的位置
			for(int n=0;n<5;n++)
				if(keyMtx[m][n]==C1) {row1=m;col1=n;}
				else if(keyMtx[m][n]==C2)	{row2=m;col2=n;}
		if(row1==row2)		//同行取左面
		{
			CP1=keyMtx[row1][col1-1<0?4:col1-1];
			CP2=keyMtx[row2][col2-1<0?4:col2-1];
		}else if(col1==col2)	//同列取上面
		{
			CP1=keyMtx[row1-1<0?4:row1-1][col1];
			CP2=keyMtx[row2-1<0?4:row2-1][col2];
		}else			//交叉取另一条对角线
		{
			CP1=keyMtx[row1][col2];
			CP2=keyMtx[row2][col1];
		}
		tmp=tmp+CP1+CP2;
	}

	for(int k=1;k<tmp.GetLength()-2;k+=2)		//删除插入的X字母
	{
		if(tmp[k]=='X')
		{
			if(tmp[k-1]==tmp[k+1])
				plain=plain+tmp[k-1];
			else
				plain=plain+tmp[k-1]+tmp[k];
		}else
		{
			plain=plain+tmp[k-1]+tmp[k];
		}
	}
	plain=plain+tmp.Right(2);
	if(plain.Right(1)=="X") plain=plain.Mid(0,plain.GetLength()-1);

}

⌨️ 快捷键说明

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