Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шифр Виженера

.docx
Скачиваний:
27
Добавлен:
20.06.2021
Размер:
119.15 Кб
Скачать

Министерство Образования и Науки Кыргызской Республики

Кыргызский Государственный Технический Университет

им. И. Раззакова

Отчет

По дисциплине: Криптография

Бишкек 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