Алгоритм шифрования Виженера на примере C++

W

WorstCoder

New member
03.01.2019
2
2
Моя задача не состоит в том что бы объяснить принцип работы шифра, так как он очень прост, я лишь хочу поделиться мною написанным алгоритмом, так как на форуме ничего не нашёл.
Но если кратко то Шифр Виженера— метод полиалфавитного буквенного текста с использованием ключевого слова.
Вики:

C++:
#include <iostream>
#include <vector>
#include <string>
/*
 
    Шифр Виженера

*/
int main()
{
    std::vector<char>Case = { ' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};// и так понятно что это
    std::vector<char>Symbol = { ' ', '+','!','@','#','$','%','^','&','*','[',']',')','(','=','`',':',';','{','}','.',',','<','>','"','?','/','\''}; // это тоже понятно

        /*Таблица Виженера*/
    std::vector< std::vector< std::vector<char>>>CryptoTable(Case.size()/*номера букв*/, std::vector<std::vector<char>>(Case.size()/*Номера ключа*/, std::vector<char>(2)));

        /*  Заполнение таблицы Виженера*/
    std::cout << "\t" << "\t" << "   CryptoTable" << "\n" << "\n";
    for (int f = 0; f < Case.size(); f++) {

        for (int g = 0; g < Case.size(); g++) {
         
            if (f == 0) {

                for (int i = 0; i < Case.size(); i++) {

                    CryptoTable[f][i][0] = Case[i];
                }
            }
            if (g == 0) {

                CryptoTable[f][g][0] = Case[f];
         
            }else {

                int AddSymbol = g;
                AddSymbol = g + f;
                if (AddSymbol > 26) {

                    AddSymbol = AddSymbol - 26;
                    CryptoTable[f][g][0] = Symbol[AddSymbol];
                }
                else {

                    CryptoTable[f][g][0] = Symbol[AddSymbol];

                }
            }
        }
    }CryptoTable[0][26][0] = Case[26];//это небольшой костыль, так как последняя буква Z почему-то не заполнялась

    /*Вывод таблицы*/
    for (int f = 0; f < Case.size();f++) {

        for (int g = 0; g < Case.size(); g++) {

            std::cout << CryptoTable[f][g][0];

        }
        std::cout << "\n";
    }
    std::cout << "\n";

    /*Ввод текста, пробелы не поддерживаются, если хотите разделить текст используйте - или _*/
    std::cout << "Enter text: ";
    std::vector<std::string>String(1);

    for (int i = 0; i < 1; i++) {

        std::cin >> String[i];

    }


    /*Заполнение ключа*/
    std::cout << "Enter key: ";
    std::vector<std::string>Key(1);
    for (int i = 0; i < 1; i++) {

        std::cin >> Key[i];

    }

    /*Проверка ключа на длину*/
    if (Key[0].size() < String[0].size()) {
        int different = String[0].size() - Key[0].size();
        for (int f = 0; f < Key.size(); f++) {
            for (int i = 0; i < different; i++) {

                Key[f].push_back(Key[f][i]);
     
            }
        }
        std::cout << "Key transformed: ";
        for (int i = 0; i < Key.size(); i++) {

            std::cout << Key[i];

        }
    }

    /*Проверка ключа на длину*/
    if (Key[0].size() > String[0].size()) {
        int different = Key[0].size() - String[0].size();
        for (int i = 0; i < different; i++) {

            Key[0].pop_back();

        }
        std::cout << "Key transformed: ";
        for (int i = 0; i < Key.size(); i++) {

            std::cout << Key[i];
        }
    }

    std::cout << "\n";

    /*Шифруем наш текст*/
    for (int a = 0; a < String.size();a++) {

        for (int s = 0; s < String[a].size(); s++) {

            for (int d = 0; d < CryptoTable[0].size(); d++) {

                if (String[a][s] == CryptoTable[0][d][0]) {

                    for (int h = 0; h < CryptoTable[0].size(); h++) {

                        if (Key[a][s] == CryptoTable[h][0][0]) {

                            String[a][s] = CryptoTable[h][d][0];

                        }
                    }
                }
            }
        }
    }

    /*Выводим зашифрованный текст*/
    std::cout << "\n" << "Your encrypted text: ";
    for (int i = 0; i < String.size(); i++) {

        std::cout << String[i];

    }

    /*Просим ввести ключ для дешифровки текста*/
    std::cout << "\n" << "Enter key for decrypt: ";
    for (int i = 0; i < 1; i++) {

        std::cin >> Key[i];

    }

    std::cout << "\n";

    /*Дешифруем текст*/
    for (int a = 0; a < Key.size(); a++) {

        for (int s = 0; s < Key[a].size(); s++) {

            for (int d = 0; d < CryptoTable[0].size();d++) {

                if (Key[a][s] == CryptoTable[d][0][0]) {

                    for (int h = 0; h < CryptoTable[0].size(); h++) {

                        if (String[a][s] == CryptoTable[d][h][0]) {

                            String[a][s] = CryptoTable[0][h][0];

                        }
                    }
                }
            }
        }
    }

    /*Выводим дешифрованный текст*/
    std::cout << "\n" << "Your decrypted text: ";
    for (int i = 0; i < String.size(); i++) {
     
        std::cout << String[i];
     
    }
    return 0;
}
P.S. Я только начал изучать криптографию, так что камнями не кидайтесь если будет ошибка
 
  • Нравится
Реакции: Sunnych и The Codeby
Мы в соцсетях: