इस योजना में, साधारण प्रतिस्थापन सिफर के मामले में एकल अक्षरों के बजाय अक्षरों के जोड़े एन्क्रिप्ट किए जाते हैं।
प्लेफेयर सिफर में, शुरू में एक की टेबल बनाई जाती है। कुंजी तालिका अक्षरों का एक 5×5 ग्रिड है जो प्लेनटेक्स्ट को एन्क्रिप्ट करने के लिए कुंजी के रूप में कार्य करता है। 25 वर्णों में से प्रत्येक अद्वितीय होना चाहिए और वर्णमाला का एक अक्षर (आमतौर पर J) तालिका से हटा दिया जाता है क्योंकि हमें 26 के बजाय केवल 25 वर्णों की आवश्यकता होती है। यदि सादे पाठ में J होता है, तो इसे I से बदल दिया जाता है।
प्रेषक और रिसीवर एक विशेष कुंजी पर, 'ट्यूटोरियल' कहते हैं। एक कुंजी तालिका में, तालिका में पहला वर्ण (बाएं से दाएं जा रहा है) वाक्यांश है, जिसमें डुप्लिकेट अक्षरों को शामिल नहीं किया गया है। शेष तालिका प्राकृतिक क्रम में वर्णमाला के शेष अक्षरों से भरी जाएगी। मुख्य तालिका के रूप में काम करता है -
प्लेफेयर सिफर की प्रक्रिया
सबसे पहले, एक सादा पाठ संदेश दो अक्षरों (डिग्राफ) के जोड़े में विभाजित होता है। यदि अक्षरों की संख्या विषम है, तो अंतिम अक्षर में एक Z जोड़ा जाता है। आइए हम उस पर विचार करें, हम "पैसे छुपाएं" संदेश को एन्क्रिप्ट करना चाहते हैं। इसे −
. के रूप में लिखा जाएगाHI DE MO NE YZ
एन्क्रिप्शन के नियम हैं -
- यदि दोनों अक्षर एक ही कॉलम में हैं, तो प्रत्येक के नीचे के अक्षर को लें (यदि नीचे की ओर शीर्ष पर जा रहे हैं)'H' और 'I' एक ही कॉलम में हैं, इसलिए उनके नीचे के अक्षर को बदलने के लिए लें। HI → क्यूसी
- यदि दोनों अक्षर एक ही पंक्ति में हैं, तो पत्र को प्रत्येक के दाईं ओर ले जाएं (यदि सबसे दूर दाईं ओर बाईं ओर वापस जा रहे हैं) 'D' और 'E' एक ही पंक्ति में हैं, इसलिए पत्र को उन्हें बदलने का अधिकार। डीई → ईएफ
- यदि पिछले दो नियमों में से कोई भी सत्य नहीं है, तो दो अक्षरों के साथ एक आयत बनाएं और अक्षरों को आयत के क्षैतिज विपरीत कोने पर लें।
इन नियमों का उपयोग करते हुए, 'ट्यूटोरियल' की कुंजी के साथ 'पैसे छुपाएं' के एन्क्रिप्शन का परिणाम होगा -
QC EF NU MF ZV
Playfair सिफर को डिक्रिप्ट करना उतना ही सरल है जितना कि रिवर्स में उसी प्रक्रिया को करना। रिसीवर के पास एक ही कुंजी होती है और वह एक ही कुंजी तालिका बना सकता है, और फिर उस कुंजी का उपयोग करके किए गए किसी भी संदेश को डिक्रिप्ट कर सकता है।
Playfair Cipher का उपयोग करके किसी संदेश को एन्कोड करने के लिए यहां एक C++ प्रोग्राम दिया गया है।
एल्गोरिदम
Begin Function void play( int dir ) For it = msg.begin() to 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) { //for same row if( j == p ) { nmsg+= getChar( j, k + dir ); nmsg += getChar( p, q + dir ); } //for same column 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() //print the solution { 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 ) { //get the characters return n[ (b + 5) % 5 ][ (a + 5) % 5 ]; } bool getPos( char l, int &c, int &d ) { //get the position 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 ) { //get the original message for( string::iterator it = t.begin(); it != t.end(); it++ ) { //to choose J = I or no Q in the alphabet. *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 ) { //creation of the key table 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 ) == -1 ) s += *it; } copy( s.begin(), s.end(), &n[0][0] ); } }; int main( int argc, char* argv[] ) { string k, i, msg; bool m, c; cout << "Encrpty or Decypt? "; 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 system( "pause" ); }
आउटपुट
Encrpty or Decypt? 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