Подстановочный шифр: какой? - PullRequest
0 голосов
/ 03 февраля 2020

Я новичок, и у меня есть вопрос (как-то глупо и глупо :)) ... Сегодня я решил бросить вызов самому себе, и я столкнулся с проблемой, которая хотела, чтобы я создал программу, которая шифрует (или шифрует) сообщение с использованием метода подстановочного шифра ... Я решил проблему сам, но мое решение отличается от самого решения ... Я просто хочу узнать, какое из них лучше и почему? а также есть ли что-то, что я пропустил в своем собственном коде?

Итак, вот код, который я написал:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string secretMessage {};
    string alphabet {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    string key {"XZNLWEBGJHQDYVTKFUOMPCIASRxznlwebgjhqdyvtkfuompciasr"};
    cout << "Enter your secret message: ";
    getline(cin, secretMessage);
    //Encryption
    for(size_t i{0}; i<secretMessage.length(); ++i){
        for(size_t j{0}; j<alphabet.length(); ++j){
            if (secretMessage.at(i) == alphabet.at(j)){
                secretMessage.at(i) = key.at(j);
                break;
            }
        }
    }
    cout << "Encrypting The Message..." << endl;
    cout << "Encrypted Message: " << secretMessage << endl;
    //Decryption
    for(size_t i{0}; i<secretMessage.length(); ++i){
        for(size_t j{0}; j<key.length(); ++j){
            if (secretMessage.at(i) == key.at(j)){
                secretMessage.at(i) = alphabet.at(j);
                break;
            }
        }
    }
    cout << "\nDecrypting The Encryption..." << endl;
    cout << "Decrypted: " << secretMessage << endl;
    return 0;
}

И вот решение:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string secretMessage {};
    string alphabet {"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    string key {"XZNLWEBGJHQDYVTKFUOMPCIASRxznlwebgjhqdyvtkfuompciasr"};
    string encryptedMessage {};
    string decryptedMessage {};
    cout << "Enter your secret message: ";
    getline(cin, secretMessage);
    cout << "\nEncrypting Message..." << endl;
    //Encryption
    for(char c:secretMessage){
        size_t position = alphabet.find(c);
        if (position != string::npos){
            char newChar {key.at(position)};
            encryptedMessage += newChar;
        } else{
            encryptedMessage += c;
        }
    }
    cout << "Encrypted Message: " << encryptedMessage << endl;
    //Decryption
    cout << "\nDecrypting Message..." << endl;
    for(char c:encryptedMessage){
        size_t position = key.find(c);
        if (position != string::npos){
            char newChar {alphabet.at(position)};
            decryptedMessage += newChar;
        } else{
            decryptedMessage += c;
        }
    }
    cout << "Decrypted Message: " << decryptedMessage << endl;
    return 0;
}

Примечание: я также включил часть расшифровки

1 Ответ

1 голос
/ 03 февраля 2020

Я нахожу оба фрагмента кода довольно сложными.

Пожалуйста, посмотрите на это более простое решение

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
    // The encoding alphabet and key
    constexpr std::string_view alphabet{ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _" };
    constexpr std::string_view  key{ "ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba_ " };    

    // String to encrypt
    std::string message{"Hello world"};

    // Here we will store the result
    std::string result;

    std::transform(message.begin(), message.end(), std::back_inserter(result), [&key, &alphabet](const char c)
        { size_t pos{ alphabet.find(c) }; return (pos != std::string::npos) ? key[pos] : '_'; });

    // Show result
    std::cout << "\nEncrypted: " << result << "\n";

    message = result;
    result.clear();
    std::transform(message.begin(), message.end(), std::back_inserter(result), [&key, &alphabet](const char c)
        { size_t pos{ alphabet.find(c) }; return (pos != std::string::npos) ? key[pos] : '_'; });

    // Show result
    std::cout << "\nDecrypted: " << result << "\n";

    return 0;
}

Это использует более современные элементы языка C ++. Шифрование и дешифрование осуществляется с помощью одного оператора std::transform каждый.

Конечно, вы никогда не должны использовать такое кодирование в реальном времени, потому что ключ виден в исполняемом файле.

В любом случае, возможно это поможет вам получить больше идей. , .

...