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

📄 playfair.cpp

📁 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 + -