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

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


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

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

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

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

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

सबसे पहले, एक प्लेनटेक्स्ट संदेश को दो अक्षरों के जोड़े (डाइग्राफ्स) में विभाजित किया जाता है। यदि अक्षरों की संख्या विषम है, तो अंतिम अक्षर में 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।

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

    एक ग्राफ का एडजेसेंसी लिस्ट प्रतिनिधित्व एक लिंक्ड लिस्ट प्रतिनिधित्व है। इस प्रतिनिधित्व में हमारे पास लिस्ट्स का एक ऐरे होता है। ऐरे का आकार V होता है। यहां V वर्टेक्स की संख्या है। दूसरे शब्दों में, हम कह सकते हैं कि हमारे पास V संख्या की अलग-अलग लिस्ट्स को स्टोर करने के लिए एक ऐरे है। यदि एक लि

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

    एक ग्राफ का इन्सिडेंस मैट्रिक्स ग्राफ को मेमोरी में स्टोर करने का एक और प्रतिनिधित्व है। यह मैट्रिक्स एक वर्ग मैट्रिक्स नहीं है। इन्सिडेंस मैट्रिक्स का ऑर्डर V x E होता है। जहां V वर्टेक्स की संख्या है और E ग्राफ में एज की संख्या है। इस मैट्रिक्स की प्रत्येक पंक्ति में हम वर्टेक्स रखते हैं, और प्रत

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

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