Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

Playfair सिफर का उपयोग करके संदेश को एन्कोड करने के लिए C++ प्रोग्राम

इस योजना में, साधारण प्रतिस्थापन सिफर के मामले में एकल अक्षरों के बजाय अक्षरों के जोड़े एन्क्रिप्ट किए जाते हैं।

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

प्रेषक और रिसीवर एक विशेष कुंजी पर, 'ट्यूटोरियल' कहते हैं। एक कुंजी तालिका में, तालिका में पहला वर्ण (बाएं से दाएं जा रहा है) वाक्यांश है, जिसमें डुप्लिकेट अक्षरों को शामिल नहीं किया गया है। शेष तालिका प्राकृतिक क्रम में वर्णमाला के शेष अक्षरों से भरी जाएगी। मुख्य तालिका के रूप में काम करता है -

Playfair सिफर का उपयोग करके संदेश को एन्कोड करने के लिए C++ प्रोग्राम

प्लेफेयर सिफर की प्रक्रिया

सबसे पहले, एक सादा पाठ संदेश दो अक्षरों (डिग्राफ) के जोड़े में विभाजित होता है। यदि अक्षरों की संख्या विषम है, तो अंतिम अक्षर में एक Z जोड़ा जाता है। आइए हम उस पर विचार करें, हम "पैसे छुपाएं" संदेश को एन्क्रिप्ट करना चाहते हैं। इसे −

. के रूप में लिखा जाएगा
HI DE MO NE YZ

एन्क्रिप्शन के नियम हैं -

  • यदि दोनों अक्षर एक ही कॉलम में हैं, तो प्रत्येक के नीचे के अक्षर को लें (यदि नीचे की ओर शीर्ष पर जा रहे हैं)'H' और 'I' एक ही कॉलम में हैं, इसलिए उनके नीचे के अक्षर को बदलने के लिए लें। HI → क्यूसी

Playfair सिफर का उपयोग करके संदेश को एन्कोड करने के लिए C++ प्रोग्राम

  • यदि दोनों अक्षर एक ही पंक्ति में हैं, तो पत्र को प्रत्येक के दाईं ओर ले जाएं (यदि सबसे दूर दाईं ओर बाईं ओर वापस जा रहे हैं) 'D' और 'E' एक ही पंक्ति में हैं, इसलिए पत्र को उन्हें बदलने का अधिकार। डीई → ईएफ

Playfair सिफर का उपयोग करके संदेश को एन्कोड करने के लिए C++ प्रोग्राम

  • यदि पिछले दो नियमों में से कोई भी सत्य नहीं है, तो दो अक्षरों के साथ एक आयत बनाएं और अक्षरों को आयत के क्षैतिज विपरीत कोने पर लें।

Playfair सिफर का उपयोग करके संदेश को एन्कोड करने के लिए C++ प्रोग्राम

इन नियमों का उपयोग करते हुए, 'ट्यूटोरियल' की कुंजी के साथ 'पैसे छुपाएं' के एन्क्रिप्शन का परिणाम होगा -

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

  1. सी ++ प्रोग्राम आसन्न सूची का उपयोग करके ग्राफ़ का प्रतिनिधित्व करने के लिए

    एक ग्राफ की आसन्न सूची प्रतिनिधित्व लिंक्ड सूची प्रतिनिधित्व है। इस निरूपण में हमारे पास सूचियों की एक सरणी है सरणी का आकार V है। यहाँ V शीर्षों की संख्या है। दूसरे शब्दों में, हम कह सकते हैं कि हमारे पास विभिन्न सूचियों के V नंबर को संग्रहीत करने के लिए एक सरणी है। यदि कोई सूची शीर्षलेख u वर्टेक्स

  1. C++ प्रोग्राम इंसीडेंस मैट्रिक्स का उपयोग करके ग्राफ का प्रतिनिधित्व करने के लिए

    एक ग्राफ की घटना मैट्रिक्स मेमोरी में स्टोर करने के लिए ग्राफ का एक और प्रतिनिधित्व है। यह मैट्रिक्स एक वर्ग मैट्रिक्स नहीं है। आपतन मैट्रिक्स का क्रम V x E है। जहाँ V शीर्षों की संख्या है और E ग्राफ़ में किनारों की संख्या है। इस मैट्रिक्स की प्रत्येक पंक्ति में हम कोने रख रहे हैं, और प्रत्येक कॉलम

  1. सी ++ प्रोग्राम आसन्न मैट्रिक्स का उपयोग करके ग्राफ का प्रतिनिधित्व करने के लिए

    एक ग्राफ का आसन्न मैट्रिक्स आकार V x V का एक वर्ग मैट्रिक्स है। V, ग्राफ G के शीर्षों की संख्या है। इस मैट्रिक्स में प्रत्येक पक्ष में V कोने चिह्नित हैं। यदि ग्राफ़ में i से j कोने तक कुछ किनारे हैं, तो ith पर आसन्न मैट्रिक्स में पंक्ति और जम्मूवें कॉलम में यह 1 (या भारित ग्राफ़ के लिए कुछ गैर-शून्