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