📄 playfaircipher_codes.cpp
字号:
#include <iostream>
#include <stdlib.h>
using namespace std;
#define MAX 1000
int main()
{
FILE *fp;
int ptn = 0, kn = 0;
char ch;
char plaintext[MAX], ciphertext[MAX], key[10];
fp = fopen("PlayfairCipher_codes.txt", "r");
//read plaintext from hw1_playfair_95610047.txt
do {
ch = '\0';
fscanf(fp, "%c", &ch);
plaintext[ptn++] = ch;
} while( ptn<MAX && plaintext[ptn-1] != '\n' );
ptn = ptn - 1;
//print Plaintext
cout << "Plaintext : " ;
for (int i=0 ; i<ptn ; i++)
cout << plaintext[i];
cout << endl << endl;
//plaintext ('j' -> 'i')
for (int i=0 ; i<ptn ; i++)
{
if (plaintext[i] == 'j')
plaintext[i] = 'i';
}
//cout << "<<" << ptn << ">>" << endl;
//read KEYWORD from hw1_playfair_95610047.txt
do
{
ch = '\0';
fscanf(fp, "%c", &ch);
key[kn++] = ch;
} while( kn<10 && key[kn-1] != '\0' );
kn = kn-1;
//print KEYWORD
cout << "Keyword : " ;
for (int i=0 ; i<kn ; i++)
cout << key[i];
cout << endl << endl;
//key ('j' -> 'i')
for (int i=0 ; i<kn ; i++)
{
if (key[i] == 'j')
key[i] = 'i';
}
//delete repeated letter from KEYWORD
for (int i=0 ; i<kn ; i++)
{
for (int j=i+1 ; j<kn ; j++)
{
if (key[i] == key[j])
{
--kn;
for (int s=j ; s<kn ; s++)
key[s] = key[s+1];
}
}
}
//cout << "<<" << kn << ">>" << endl;
char matrix[5][5]; //5*5 matrix of letters based on a KEYWORD
char temp[25];
//fill in letters of KEYWORD
for (int i=0 ; i<kn ; i++)
temp[i] = key[i];
//fill rest of matrix with other letters
for (int i=kn ; i<25 ; i++)
{
for (int h=97 ; h<=122 ; h++)
{
if (h == 106) //'j' -> 'i'
continue;
int is = 1;
for (int e=0 ; e<i ; e++)
{
if (temp[e] == char(h))
{
is = 0;
break;
}
}
if (is)
{
temp[i] = char(h);
break;
}
}
}
//print 5*5 Matrix
cout << "< Matrix >" << endl;
for (int i=0 ; i<25 ; i+=5)
{
for (int j=i ; j<i+5 ; j++)
cout << temp[j] << " ";
cout << endl;
}
cout << endl;
//temp[25] -> matrix[5][5]
int k = 0;
for (int i=0 ; i<5 ; i++)
{
k = i*5;
for (int j=0 ; j<5 ; j++)
{
matrix[i][j] = temp[k];
k++;
}
}
//if a pair is a repeated letter, insert filler like 'X'
int axn = ptn; //number of filler
for (int i=0 ; i<axn/2 ; i++)
{
if (plaintext[i*2] == plaintext[i*2+1])
{
for (int j=axn ; j>i*2+1 ; j--)
plaintext[j] = plaintext[j-1];
plaintext[i*2+1] = 'x';
axn++;
i = (-1);
}
}
//if length of plaintext is odd, insert filler like 'X'
if ((axn%2) != 0)
{
plaintext[axn] = 'x';
axn++;
}
cout << "Temp : " ;
for (int i=0 ; i<axn ; i+=2)
cout << plaintext[i] << plaintext[i+1] << " ";
cout << endl << endl;
//Encrypting
int row1, column1;
int row2, column2;
for (int r=0 ; r<(axn/2) ; r++) //r -> round
{
for (int i=0 ; i<5 ; i++)
{
for (int j=0 ; j<5 ; j++)
{
if (plaintext[r*2] == matrix[i][j])
{
row1 = i;
column1 = j;
}
if (plaintext[r*2+1] == matrix[i][j])
{
row2 = i;
column2 = j;
}
}
}
if (row1 == row2) //fall in the same row
{
ciphertext[r*2] = matrix[row1][(column1+1)%5];
ciphertext[r*2+1] = matrix[row2][(column2+1)%5];
} else
if (column1 == column2) //fall in the same column
{
ciphertext[r*2] = matrix[(row1+1)%5][column1];
ciphertext[r*2+1] = matrix[(row2+1)%5][column2];
}
else //otherwise
{
ciphertext[r*2] = matrix[row1][column2];
ciphertext[r*2+1] = matrix[row2][column1];
}
}
cout << "Ciphertext : " ;
for (int i=0 ; i<axn ; i+=2)
cout << ciphertext[i] << ciphertext[i+1] << " ";
cout << endl << endl;
fclose(fp);
system ("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -