WorstCoder
One Level
				
			- 03.01.2019
 
- 2
 
- 2
 
Моя задача не состоит в том что бы объяснить принцип работы шифра, так как он очень прост, я лишь хочу поделиться мною написанным алгоритмом, так как на форуме ничего не нашёл.
Но если кратко то Шифр Виженера— метод полиалфавитного
Вики:
	
	
	
	
		
P.S. Я только начал изучать криптографию, так что камнями не кидайтесь если будет ошибка
				
			Но если кратко то Шифр Виженера— метод полиалфавитного
	Ссылка скрыта от гостей
 буквенного текста с использованием ключевого слова.Вики:
	Ссылка скрыта от гостей
		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. Я только начал изучать криптографию, так что камнями не кидайтесь если будет ошибка