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

📄 playfair.cpp

📁 Playfair encryption
💻 CPP
字号:
#include <iostream>
#include <conio.h>
using namespace std;

int matrice[5][5];

void citire_matrice()
{
	unsigned int i,j;
	char c;
	for (i=0;i<5;i++)
	{
		for (j=0;j<5;j++)
		{
			c=getch();
			cout<<" "<<c;
			matrice[i][j]=c-97;
		}
		cout<<endl;
	}
}


class cuvinte
{
	public:
	unsigned int size;
	int *mesaj;

	cuvinte()
	{
		unsigned int i;
		char c;
		cout<<"Dati lungimea sirului "; cin>>size;
		mesaj = new int[size];
		cout<<"Tastati sirul"<<endl;
		for (i=0;i<size;i++) 
		{
			c=getch();
			cout<<c;
			mesaj[i]=c-97;
		}
	}

	cuvinte(int x)
	{
		size = x;
		mesaj = new int[size];
	}

	void afisare()
	{
		cout<<endl;
		char c;
		unsigned int i;
		for (i=0;i<size;i++) 
		{
			if (mesaj[i]<=25) c=mesaj[i]+97;
			cout<<c;
		}

		getch();
	}

	~cuvinte()
	{
	} 
};

void codare_playfair(cuvinte mesaj)
{
	unsigned int i,j,k;
	int x1,y1,x2,y2;
	cuvinte codat(mesaj.size);
	for (i=0;i<mesaj.size-1;i++) 
	{
		if (mesaj.mesaj[i]==mesaj.mesaj[i+1]) 
		{
			mesaj.size++;
			for (j=mesaj.size-1;j>=i+1;j--) mesaj.mesaj[j+1]=mesaj.mesaj[j];
			mesaj.mesaj[i+1]=22; // am folosit ca litera de frecventa redusa w2
		}
		if (mesaj.mesaj[i]==16) mesaj.mesaj[i]=22;
	}

	if (mesaj.size%2!=0) 
	{
		mesaj.size++;
		mesaj.mesaj[mesaj.size-1]=22;
	}
	
	for (k=0;k<mesaj.size/2;k++) 
	{
		for (i=0;i<5;i++)
			for (j=0;j<5;j++) 
			{
				if (mesaj.mesaj[2*k]==matrice[i][j]) { x1=i; y1=j;}
				if (mesaj.mesaj[2*k+1]==matrice[i][j]) {x2=i; y2=j;}
			}
			
			if (x1==x2) 
			{
				codat.mesaj[2*k]=matrice[x1][(y1+1)%5];
				codat.mesaj[2*k+1]=matrice[x2][(y2+1)%5];
			}

			if (y1==y2)
			{
				if (x1==0) x1=5;
				if (x2==0) x2=5;
				codat.mesaj[2*k]=matrice[(x1-1)%5][y1];
				codat.mesaj[2*k+1]=matrice[(x2-1)%5][y2];
			}

			if (x1!=x2&&y1!=y2) 
			{
				codat.mesaj[2*k]=matrice[x1][y2];
				codat.mesaj[2*k+1]=matrice[x2][y1];
			}
	}
	codat.afisare();
}

void decodare_playfair(cuvinte mesaj)
{
	unsigned int i,j,k;
	int x1,x2,y1,y2;
	cuvinte decodat(mesaj.size);
	for (k=0;k<mesaj.size/2;k++) 
	{
		for (i=0;i<5;i++)
			for (j=0;j<5;j++) 
			{
				if (mesaj.mesaj[2*k]==matrice[i][j]) { x1=i; y1=j;}
				if (mesaj.mesaj[2*k+1]==matrice[i][j]) {x2=i; y2=j;}
			}
			
			if (x1==x2) 
			{
				if (y1==0) y1=5;
				if (y2==0) y2=5;
				decodat.mesaj[2*k]=matrice[x1][(y1-1)%5];
				decodat.mesaj[2*k+1]=matrice[x2][(y2-1)%5];
			}

			if (y1==y2)
			{
				decodat.mesaj[2*k]=matrice[(x1+1)%5][y1];
				decodat.mesaj[2*k+1]=matrice[(x2+1)%5][y2];
			}

			if (x1!=x2&&y1!=y2) 
			{
				decodat.mesaj[2*k]=matrice[x1][y2];
				decodat.mesaj[2*k+1]=matrice[x2][y1];
			}
	}
	decodat.afisare();
}

void main()
{
	unsigned int i,j;
	cout<<"Dati matricea cheie pt sistemul Playfair."<<endl<<"Daca nu contine w programu nu va functiona corect"<<endl;
	citire_matrice();
	cout<<"Dati mesajul de transmis fara spatii."<<endl<<"Programul nu va merge bine daca mesajul va avea spatii"<<endl;
	cuvinte mesaj;
	cout<<endl<<"1 pt codare 2 pt decodare"<<endl;
	cin>>i;
	if (i==1) codare_playfair(mesaj);
	if (i==2) decodare_playfair(mesaj);
}

⌨️ 快捷键说明

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