158 lines
3.6 KiB
C++
158 lines
3.6 KiB
C++
/*
|
|
* C++ Program to Encode a Message Using Playfair Cipher
|
|
*/
|
|
#include<iostream>
|
|
#include<vector>
|
|
using namespace std;
|
|
|
|
void get_pos(char, int&, int&);
|
|
void same_row(int, vector<char>&, int, int);
|
|
void same_column(int, vector<char>&, int, int);
|
|
void diff_col_row(int, int, vector<char>&, int, int);
|
|
void encode(vector<char>, int);
|
|
void get_input(vector<char>&);
|
|
void convert_string(vector<char>&, vector<char>&);
|
|
|
|
const char encoder[5][5]= {{'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'}
|
|
};
|
|
|
|
void get_pos(char p, int& r, int& c)
|
|
{
|
|
if (p < 'J')
|
|
{
|
|
r = (p - 65) / 5;
|
|
c = (p - 65) % 5;
|
|
}
|
|
else if (p > 'J')
|
|
{
|
|
r = (p - 66) / 5;
|
|
c = (p - 66) % 5;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void same_row(int r, vector<char>& code, int c1, int c2)
|
|
{
|
|
code.push_back(encoder[r][(c1 + 1) % 5]);
|
|
code.push_back(encoder[r][(c2 + 1) % 5]);
|
|
return;
|
|
}
|
|
|
|
void same_column(int c, vector<char>& code, int r1, int r2)
|
|
{
|
|
code.push_back(encoder[(r1 + 1) % 5][c]);
|
|
code.push_back(encoder[(r2 + 1) % 5][c]);
|
|
return;
|
|
}
|
|
|
|
void diff_col_row(int r1, int c1, vector<char>& code, int r2, int c2)
|
|
{
|
|
code.push_back(encoder[r1][c2]);
|
|
code.push_back(encoder[r2][c1]);
|
|
return;
|
|
}
|
|
|
|
void encode(vector<char> msgx, int len)
|
|
{
|
|
vector<char> code;
|
|
int i = 0, j = 0;
|
|
int r1, c1, r2, c2;
|
|
while (i < len)
|
|
{
|
|
get_pos(msgx[i], r1, c1);
|
|
i++;
|
|
get_pos(msgx[i], r2, c2);
|
|
if (r1 == r2)
|
|
{
|
|
same_row(r1, code, c1, c2);
|
|
}
|
|
else if (c1 == c2)
|
|
{
|
|
same_column(c1, code, r1, r2);
|
|
}
|
|
else
|
|
{
|
|
diff_col_row(r1, c1, code, r2, c2);
|
|
}
|
|
i++;
|
|
}
|
|
cout<<"\nCODE: ";
|
|
for (j = 0; j < code.size(); j++)
|
|
{
|
|
cout<<code[j];
|
|
}
|
|
return;
|
|
}
|
|
|
|
void get_input(vector<char>& a)
|
|
{
|
|
char c;
|
|
while (1)
|
|
{
|
|
c = getchar();
|
|
if (c >= 97 && c <= 122)
|
|
c- =32;
|
|
if (c == '\n')
|
|
break;
|
|
else if (c==' ')
|
|
continue;
|
|
else if (c == 'J')
|
|
a.push_back('I');
|
|
a.push_back(c);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void convert_string(vector<char>& msg, vector<char>& msgx)
|
|
{
|
|
int i, j;
|
|
i = j = 0;
|
|
while (i < msg.size())
|
|
{
|
|
msgx.push_back(msg[i]);
|
|
i++;
|
|
if (i == msg.size())
|
|
{
|
|
msgx.push_back('X');
|
|
break;
|
|
}
|
|
if (msg[i] == msgx[j])
|
|
{
|
|
msgx.push_back('X');
|
|
j++;
|
|
}
|
|
else if(msg[i] != msgx[j])
|
|
{
|
|
j++;
|
|
msgx.push_back(msg[i]);
|
|
i+ = 1;
|
|
}
|
|
j++;
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
vector<char> msg;
|
|
vector<char> msgx;
|
|
int i, j;
|
|
cout<<"Enter Message to Encrypt:";
|
|
get_input(msg);
|
|
convert_string(msg, msgx);
|
|
int len = msgx.size();
|
|
/*
|
|
cout<<"\n\n";
|
|
for (i = 0;i < len;i++)
|
|
cout<<msgx[i];
|
|
*///this is the string after making pairs of 2
|
|
encode(msgx, len);
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
Enter Message to Encrypt:Balloon
|
|
CODE: CBNVMPPO
|