इस योजना में, अक्षरों के जोड़े एन्क्रिप्ट किए जाते हैं, सिंपल सब्स्टीट्यूशन सिफर के मामले में सिंगल अक्षरों के बजाय।
प्लेफेयर सिफर में, प्रारंभ में एक कुंजी टेबल बनाई जाती है। कुंजी टेबल अल्फाबेट्स का एक 5x5 ग्रिड होता है जो प्लेनटेक्स्ट को एन्क्रिप्ट करने के लिए कुंजी के रूप में कार्य करता है। 25 अल्फाबेट्स में से प्रत्येक अद्वितीय होना चाहिए और वर्णमाला का एक अक्षर (आमतौर पर J) टेबल से छोड़ा जाता है क्योंकि हमें 26 के बजाय केवल 25 अल्फाबेट्स की आवश्यकता होती है। यदि प्लेनटेक्स्ट में J है, तो इसे I से बदल दिया जाता है।
भेजने वाला और प्राप्त करने वाला एक विशेष कुंजी पर निर्णय लेते हैं, जैसे 'tutorials'। एक कुंजी टेबल में, टेबल में पहले कैरेक्टर्स (बाएं से दाएं जा रहे) वाक्यांश होते हैं, डुप्लिकेट अक्षरों को छोड़कर। टेबल का बाकी हिस्सा वर्णमाला के शेष अक्षरों से प्राकृतिक क्रम में भरा जाएगा।

प्लेफेयर सिफर की प्रक्रिया
सबसे पहले, एक प्लेनटेक्स्ट संदेश को दो अक्षरों के जोड़े (डाइग्राफ्स) में विभाजित किया जाता है। यदि अक्षरों की संख्या विषम है, तो अंतिम अक्षर में Z जोड़ा जाता है। मान लीजिए हम संदेश "hide money" को एन्क्रिप्ट करना चाहते हैं। इसे इस तरह लिखा जाएगा:
HI DE MO NE YZ
एन्क्रिप्शन के नियम हैं:
- यदि दोनों अक्षर एक ही कॉलम में हैं, तो प्रत्येक के नीचे का अक्षर लें (नीचे पहुंचने पर ऊपर वापस जाएं)। 'H' और 'I' एक ही कॉलम में हैं, इसलिए उन्हें बदलने के लिए नीचे का अक्षर लें। HI → QC
- यदि दोनों अक्षर एक ही पंक्ति में हैं, तो प्रत्येक के दाईं ओर का अक्षर लें (दाईं ओर पहुंचने पर बाईं ओर वापस जाएं)। 'D' और 'E' एक ही पंक्ति में हैं, इसलिए उन्हें बदलने के लिए दाईं ओर का अक्षर लें। DE → EF
- यदि उपरोक्त दो नियमों में से कोई भी सत्य नहीं है, तो दो अक्षरों के साथ एक आयत बनाएं और आयत के क्षैतिज विपरीत कोने पर अक्षर लें।
इन नियमों का उपयोग करके, 'tutorials' कुंजी के साथ 'hide money' के एन्क्रिप्शन का परिणाम होगा:
QC EF NU MF ZV
प्लेफेयर सिफर को डिक्रिप्ट करना रिवर्स में वही प्रक्रिया करने जितना सरल है। प्राप्तकर्ता के पास वही कुंजी होती है और वह वही कुंजी टेबल बना सकता है, और फिर उस कुंजी का उपयोग करके बने किसी भी संदेश को डिक्रिप्ट कर सकता है।
यहां प्लेफेयर सिफर का उपयोग करके संदेश को एन्कोड करने के लिए एक C++ प्रोग्राम दिया गया है।
एल्गोरिदम
Begin
Function void play(int dir)
For it = msg.begin() से it != msg.end() तक
If (getPos(*it++, j, k))
If (getPos(*it, p, q))
If (j == p)
nmsg += getChar(j, k + dir)
nmsg += getChar(p, q + dir)
else if (k == q)
nmsg += getChar(j + dir, k)
nmsg += getChar(p + dir, q)
else
nmsg += getChar(p, k)
nmsg += getChar(j, q)
done
done
done
msg = nmsg
done
End
उदाहरण
#include <iostream>
#include <string>
using namespace std;
class playfair {
public:
string msg;
char n[5][5];
void play(string k, string t, bool m, bool e) {
createEncoder(k, m);
getText(t, m, e);
if(e)
play(1);
else
play(-1);
print();
}
private:
void play(int dir) {
int j, k, p, q;
string nmsg;
for(string::const_iterator it = msg.begin(); it != msg.end(); it++) {
if(getPos(*it++, j, k))
if(getPos(*it, p, q)) {
// समान पंक्ति के लिए
if(j == p) {
nmsg += getChar(j, k + dir);
nmsg += getChar(p, q + dir);
}
// समान कॉलम के लिए
else if(k == q) {
nmsg += getChar(j + dir, k);
nmsg += getChar(p + dir, q);
} else {
nmsg += getChar(p, k);
nmsg += getChar(j, q);
}
}
}
msg = nmsg;
}
void print() { // समाधान प्रिंट करें
cout << "\n\n Solution:" << endl;
string::iterator it = msg.begin(); int count = 0;
while(it != msg.end()) {
cout << *it;
it++;
cout << *it << " ";
it++;
if(++count >= 26)
cout << endl;
count = 0;
}
cout << endl << endl;
}
char getChar(int a, int b) { // कैरेक्टर्स प्राप्त करें
return n[(b + 5) % 5][(a + 5) % 5];
}
bool getPos(char l, int &c, int &d) { // स्थिति प्राप्त करें
for(int y = 0; y < 5; y++)
for(int x = 0; x < 5; x++)
if(n[y][x] == l) {
c = x;
d = y;
return true;
}
return false;
}
void getText(string t, bool m, bool e) { // मूल संदेश प्राप्त करें
for(string::iterator it = t.begin(); it != t.end(); it++) {
// J = I या वर्णमाला में कोई Q चुनने के लिए
*it = toupper(*it);
if(*it < 65 || *it > 90)
continue;
if(*it == 'J' && m)
*it = 'I';
else if(*it == 'Q' && !m)
continue;
msg += *it;
}
if(e) {
string nmsg = "";
size_t len = msg.length();
for(size_t x = 0; x < len; x += 2) {
nmsg += msg[x];
if(x + 1 < len) {
if(msg[x] == msg[x + 1]) nmsg += 'X';
nmsg += msg[x + 1];
}
}
msg = nmsg;
}
if(msg.length() & 1)
msg += 'X';
}
void createEncoder(string key, bool m) { // कुंजी टेबल का निर्माण
if(key.length() < 1)
key = "KEYWORD";
key += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string s = "";
for(string::iterator it = key.begin(); it != key.end(); it++) {
*it = toupper(*it);
if(*it < 65 || *it > 90)
continue;
if((*it == 'J' && m) || (*it == 'Q' && !m))
continue;
if(s.find(*it) == string::npos)
s += *it;
}
copy(s.begin(), s.end(), &n[0][0]);
}
};
int main(int argc, char* argv[]) {
string k, i, msg;
bool m, c;
cout << "Encrypt or Decrypt? ";
getline(cin, i);
c = (i[0] == 'e' || i[0] == 'E');
cout << "Enter a key: ";
getline(cin, k);
cout << "I <-> J (Y/N): ";
getline(cin, i);
m = (i[0] == 'y' || i[0] == 'Y');
cout << "Enter the message: ";
getline(cin, msg);
playfair pf;
pf.play(k, msg, m, c);
return 0;
}
आउटपुट
Encrypt or Decrypt? e Enter a key: players I <-> J (Y/N): y Enter the message: This is tutorialspoint Solution: OK GC GC MZ MQ CF YA RL QH OM
यह प्रोग्राम प्लेफेयर सिफर का उपयोग करके प्लेनटेक्स्ट को एन्क्रिप्ट करता है। समान कोड एन्क्रिप्शन (dir=1) और डिक्रिप्शन (dir=-1) दोनों को संभालता है। कुंजी "players" से 5x5 मैट्रिक्स बनती है, J को I के साथ मर्ज किया जाता है। आउटपुट डाइग्राफ्स में दिखाता है: OK GC GC MZ MQ CF YA RL QH OM।