📄 playfair.cpp
字号:
// Playfair.cpp : implementation file
//
#include "stdafx.h"
#include "cryptology.h"
#include "Playfair.h"
#include "math.h"
#define KEY_LEN 10
#define TEXT_LEN 50
/*#ifdef _DEBUG
#define new DEBUG_NEW
#define NUM 100
#define N 1024
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
char *text[N];
char *key[N];*/
/////////////////////////////////////////////////////////////////////////////
// Playfair property page
IMPLEMENT_DYNCREATE(Playfair, CPropertyPage)
Playfair::Playfair() : CPropertyPage(Playfair::IDD)
{
//{{AFX_DATA_INIT(Playfair)
m_playfair_ciphertext = _T("");
m_playfair_key = _T("");
m_playfair_plaintext = _T("");
//}}AFX_DATA_INIT
}
Playfair::~Playfair()
{
}
void Playfair::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Playfair)
DDX_Text(pDX, IDC_CIPHERTEXT, m_playfair_ciphertext);
DDX_Text(pDX, IDC_KEY, m_playfair_key);
DDX_Text(pDX, IDC_PLAINTEXT, m_playfair_plaintext);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Playfair, CPropertyPage)
//{{AFX_MSG_MAP(Playfair)
ON_BN_CLICKED(IDC_ENCRY, OnEncry)
ON_BN_CLICKED(IDC_DECRY, OnDecry)
//ON_BN_CLICKED(IDC_GRAPH, OnGraph)
//ON_BN_CLICKED(IDC_OPEN_PLAINTEXT_FILE_BUTTON, OnOpenPlaintextFileButton)
//ON_BN_CLICKED(IDC_OPEN_CIPHERTEXT_FILE_BUTTON, OnOpenCiphertextFileButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Playfair message handlers
void Playfair::OnEncry()
{
UpdateData();
char *key=new char[m_playfair_key.GetLength()];
key=m_playfair_key.GetBuffer(m_playfair_key.GetLength());
char *plaintext=new char[m_playfair_plaintext.GetLength()];
plaintext=m_playfair_plaintext.GetBuffer(m_playfair_plaintext.GetLength());
char *ciphertext=new char[m_playfair_plaintext.GetLength()];
Encipher(plaintext,key,ciphertext);
for(int i=0;i<(int)strlen(ciphertext);i++)
m_playfair_ciphertext.Insert(i,ciphertext[i]);
UpdateData(FALSE);
}
void Playfair::OnDecry()
{
UpdateData();
char *key=new char[m_playfair_key.GetLength()];
key=m_playfair_key.GetBuffer(m_playfair_key.GetLength());
char *ciphertext=new char[m_playfair_ciphertext.GetLength()];
ciphertext=m_playfair_ciphertext.GetBuffer(m_playfair_ciphertext.GetLength());
char *plaintext=new char[m_playfair_ciphertext.GetLength()];
Decipher(plaintext,key,ciphertext);
for(int i=0;i<(int)strlen(ciphertext);i++)
m_playfair_plaintext.Insert(i,plaintext[i]);
UpdateData(FALSE);
}
void Playfair::Decipher(char* plaintext,char* key,char *ciphertext)
{
char square5_5[25];
char alphabet[25]={'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int i,j,k,flag1,flag2;
int flag;
int alphabet_len=25;
int keylen,cipherlen;
keylen=strlen(key);
for (i=0;i<keylen;i++)//处理密钥
{
for(j=i+1;j<keylen;j++)
if(key[j]==key[i])
{
for(k=j;k<keylen;k++)
{
key[k]=key[k+1];
}
key[keylen-1]='\0';
keylen=keylen-1;
}
}
for(i=0;i<keylen;i++)
{
if(key[i]=='j')
key[i]='i';
}
for(i=0;i<keylen;i++)//输出5*5密钥矩阵
{
square5_5[i]=key[i];
}
for (i=0;i<keylen;i++)
{
for(j=0;j<25;j++)
if(alphabet[j]==key[i])
{
for(k=j;k<25;k++)
{
alphabet[k]=alphabet[k+1];
}
alphabet[alphabet_len-1]='\0';
alphabet_len=alphabet_len-1;
}
}
for(i=keylen,j=0;i<25&&j<25;i++,j++)
square5_5[i]=alphabet[j];
for(i=0,j=0;i<25;i++)
{
if(i==5+5*j)
{
//printf("\n");
j++;
}
}
//printf("\n");
cipherlen=strlen(ciphertext);
for(k=j=0,i=0;i<cipherlen;i++)
{
flag1=search(square5_5,ciphertext[i]);
flag2=search(square5_5,ciphertext[i+1]);
if((flag1/5)==flag2/5)
{
if(flag1==5*j)
{
plaintext[i]=square5_5[flag1+4];
j++;
}
else
plaintext[i]=square5_5[flag1-1];
if(flag2==5*k)
{
plaintext[i+1]=square5_5[flag2+4];
k++;
}
else
plaintext[i+1]=square5_5[flag2-1];
}
else if((flag1-flag2)%5==0)
{
if(flag1>=0&&flag1<=4)
plaintext[i]=square5_5[flag1+20];
else
plaintext[i]=square5_5[flag1-5];
if(flag2>=0&&flag2<=4)
plaintext[i+1]=square5_5[flag2+20];
else
plaintext[i+1]=square5_5[flag2-5];
}
else
{
flag=abs((int)(flag1/5)-(int)(flag2/5))*5;
if(flag1<flag2)
{
plaintext[i]=square5_5[flag2-flag];
plaintext[i+1]=square5_5[flag1+flag];
}
else if(flag1>flag2)
{
plaintext[i]=square5_5[flag2+flag];
plaintext[i+1]=square5_5[flag1-flag];
}
}
i++;
}
//处理明文
for (i=0;i<cipherlen;i++)
{
if((plaintext[i]==plaintext[i+2])&&(plaintext[i+1]=='q'))
{
for(k=i;k<cipherlen;k++)
{
plaintext[k+1]=plaintext[k+2];
}
plaintext[cipherlen-1]='\0';
cipherlen=cipherlen-1;
}
}
plaintext[i]='\0';
}
int Playfair::search(char a[],char x)
{
int flag;
for(flag=0;flag<25;flag++)
if(x==a[flag])
break;
return flag;
}
void Playfair::Encipher(char* plaintext,char* key,char *ciphertext)
{
char square5_5[25];
char alphabet[25]={'a','b','c','d','e','f','g','h','i','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int i,j,k,flag1,flag2;
int flag;
int alphabet_len=25;
int keylen,plainlen;
keylen=strlen(key);
for (i=0;i<keylen;i++)//处理密钥
{
for(j=i+1;j<keylen;j++)
if(key[j]==key[i])//如果
{
for(k=j;k<keylen;k++)
{
key[k]=key[k+1];
}
key[keylen-1]='\0';
keylen=keylen-1;
}
}
for(i=0;i<keylen;i++) //key中的j用i替代
{
if(key[i]=='j')
key[i]='i';
}
for(i=0;i<keylen;i++)//输出5*5密钥矩阵
{
square5_5[i]=key[i];
}
for (i=0;i<keylen;i++)
{
for(j=0;j<25;j++)
if(alphabet[j]==key[i])
{
for(k=j;k<25;k++)
{
alphabet[k]=alphabet[k+1];
}
alphabet[alphabet_len-1]='\0';
alphabet_len=alphabet_len-1;
}
}
for(i=keylen,j=0;i<25&&j<25;i++,j++)
square5_5[i]=alphabet[j];
plainlen=strlen(plaintext);
for(i=0;i<plainlen;i++) //处理明文
{
if(plaintext[i]=='j')
plaintext[i]='i';
}
for (i=0;i<plainlen;i++)
{
if(plaintext[i]==plaintext[i+1])
{
for(j=plainlen;j>=i+2;j--)
{
plaintext[j]=plaintext[j-1];
}
if(plaintext[i]!='q')
plaintext[i+1]='q';
else
plaintext[i+1]='x';
plaintext[plainlen+1]='\0';
plainlen=plainlen+1;
}
}
if((plainlen%2)!=0)
{
plaintext[plainlen+1]='q';
plaintext[plainlen+2]='\0';
}
for(k=j=1,i=0;i<plainlen;i++)
{
flag1=search(square5_5,plaintext[i]);
flag2=search(square5_5,plaintext[i+1]);
if((flag1/5)==flag2/5)
{
if(flag1==5*j-1)
{
ciphertext[i]=square5_5[flag1-4];
j++;
}
else
ciphertext[i]=square5_5[flag1+1];
if(flag2==5*k-1)
{
ciphertext[i+1]=square5_5[flag2-4];
k++;
}
else
ciphertext[i+1]=square5_5[flag2+1];
}
else if((flag1-flag2)%5==0)
{
if(flag1>=20&&flag1<=24)
ciphertext[i]=square5_5[flag1-20];
else
ciphertext[i]=square5_5[flag1+5];
if(flag2>=20&&flag2<=24)
ciphertext[i+1]=square5_5[flag2-20];
else
ciphertext[i+1]=square5_5[flag2+5];
}
else
{
flag=abs((int)(flag1/5)-(int)(flag2/5))*5;
if(flag1<flag2)
{
ciphertext[i]=square5_5[flag2-flag];
ciphertext[i+1]=square5_5[flag1+flag];
}
else if(flag1>flag2)
{
ciphertext[i]=square5_5[flag2+flag];
ciphertext[i+1]=square5_5[flag1-flag];
}
}
i++;
}
ciphertext[i]='\0';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -