
Шифр Виженера
.docxМинистерство Образования и Науки Кыргызской Республики
Кыргызский Государственный Технический Университет
им. И. Раззакова
Отчет
По дисциплине: Криптография
Бишкек 2020 год
Шифр Виженера
Как и в других алгоритмах шифрования, он принимает на вход текст и ключ, обрабатывает и выводит зашифрованный текст. Но в отличие от шифра Цезаря, ключ которого был ограничен числом от 0 до 25, этот шифр принимает в качестве ключа слово(фразу), каждая буква которого будет являться отдельным ключом для сдвига соответствующей буквы во входной фразе.
Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для шифрования может использоваться таблица алфавитов, называемая квадратом Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря.
Реализация Шифра Виженера на С++
Итак нам необходимо написать функцию которая, будет принимать в качестве аргументов исходный текст и ключ, а возвращать уже зашифрованный текст.
А сам шифрование каждой отдельной буквы при прогоне текста по циклу будет выглядеть в виде подобного выражения: (с - буква из исходного текста)
c = (((c - 'a') + (key[i++ % key.size()] - 'a')) % 26) + 'a';
Что очень напоминает выражение, которое применяли в шифре Цезаря, не так ли?)
А сама функция будет выглядеть следующим образом:
#include <iostream>
#include <string>
using namespace std;
string encrypt(string text, string key) {
string result = text;
int i = 0;
for (auto & c: result) {
if (islower(c)) {
c = (((c - 'a') + (key[i++ % key.size()] - 'a')) % 26) + 'a';
} else if (isupper(c)) {
c = (((c - 'A') + (key[i++ % key.size()] - 'A')) % 26) + 'A';
}
}
return result;
}
string decrypt(string str, string key) {
string k = key;
for (auto & c: k) {
c = tolower(c) - 'a' - 1;
c = 'z' - c;
}
return encrypt(str, k);
}
int main() {
string text, key;
cout << "Введите текст" << endl;
getline(cin, text);
cout << "Введите ключ" << endl;
getline(cin, key);
cout << "Зашифрованный текст" << endl;
string cipher(encrypt(text, key));
cout << cipher << endl;
cout << "Расшифрованный текст" << endl;
cout << decrypt(cipher, key) << endl;
}
К примеру входной текст будет: input А ключом будет являться: output То на выходе мы получим: whijn