📄 myfuncs.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 + -