Metod_Vizhenera_savenkov_Ivan_Kn-1_2-Kurs / Отчёт(Виженер)
.docx
Отчет
по алгоритму шифрования
Метод замены. Шифр Виженера
Подготовил студент
группы КН-1
Савенков И. Н.
Преподаватель
Петренко Т.Г
Описание алгоритма
Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для зашифровывания может использоваться таблица алфавитов, называемая tabula recta или квадрат (таблица) Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова.
Расшифровывание производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.
Шифрирование:
Дешифрирование:
-номер кодируемого символа;
-номер ключевого символа;
- количество символов в алфавите;
-закодированный символ;
Tabula Recta :
Таблица Виженера строится следующим образом: сверху и по левому краю квадрата выписывается исходный алфавит. В первую строку квадрата заносится перестановка из букв алфавита. Во второй строке та же перестановка циклически сдвигается на одну позицию влево, в третьей – на две и т.д.
Зашифровка сообщения с помощью таблицы :
,
С- закодированный символ
T-символ в таблице Виженера
- символ в слове
- символ ключевого слова
- элемент в таблице Виженера
Расшифровка сообщения с помощью таблицы :
, ;
Индекс j подразумевает симол кода в ключевой строке.
-закодированный символ;
- количество символов в алфавите;
Выполнение
Шаг 1. Кодирование слова.
Пользователь вводит слово без пробелов и для зашифровки. После считывания данных по всей длине кодируемого сообщения записывается ключ. После начинается суммирование символа из слова и ключа, далее суммирование по mod 26 (в английском алфавите 26 букв) и поиск по номеру соответствующей буквы.
Массив символов:
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
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 |
Пример:
Сообщение: Hello world
Ключ : Boy
Сообщение |
|||||||||
h |
e |
l |
l |
o |
w |
o |
r |
l |
d |
7 |
4 |
11 |
11 |
14 |
22 |
14 |
17 |
11 |
3 |
+ |
|||||||||
Ключ |
|||||||||
b |
o |
y |
b |
o |
y |
b |
o |
y |
b |
1 |
14 |
24 |
1 |
14 |
24 |
1 |
14 |
24 |
1 |
СУММА |
|||||||||
8 |
18 |
35 |
12 |
28 |
46 |
15 |
31 |
33 |
4 |
mod26 |
|||||||||
8 |
18 |
9 |
12 |
2 |
20 |
15 |
5 |
9 |
4 |
Поиск символа соответствующего номеру |
|||||||||
= |
|||||||||
Шифр |
|||||||||
i |
s |
j |
m |
c |
u |
p |
f |
j |
e |
4 |
18 |
9 |
12 |
2 |
20 |
15 |
5 |
9 |
4 |
Шаг 2. Декодирование слова.
Ключевое слово записывается по всей длине закодированного слова. Берется i-ый символ из ключа (i=0..size) по таблице находится строка с этим символом, затем в строке находится i-ый символ в данной строке , после берётся символ, который соответствует данному столбцу и помещается в разкодирванную строку.
Закодированное сообщение |
|||||||||
i |
s |
j |
m |
c |
u |
p |
f |
j |
e |
4 |
18 |
9 |
12 |
2 |
20 |
15 |
5 |
9 |
4 |
- |
|||||||||
Ключ |
|||||||||
b |
o |
y |
b |
o |
y |
b |
o |
y |
b |
1 |
14 |
24 |
1 |
14 |
22 |
1 |
14 |
22 |
1 |
Разность |
|||||||||
3 |
4 |
-15 |
11 |
-12 |
-2 |
14 |
-9 |
-13 |
3 |
+ |
|||||||||
26 |
|||||||||
19 |
30 |
11 |
37 |
14 |
24 |
40 |
17 |
13 |
19 |
mod 26 |
|||||||||
7 |
4 |
11 |
11 |
14 |
22 |
14 |
17 |
11 |
3 |
= |
|||||||||
Исходное сообщение |
|||||||||
h |
e |
l |
l |
o |
w |
o |
r |
l |
d |
7 |
4 |
11 |
11 |
14 |
22 |
14 |
17 |
11 |
3 |
Листинг
//Savenkov Ivan Nikolaevich
//CS-1
//"Симметричная криптосистема"
//Метод замены. Шифр Виженера
#include "vigener.h"
#include "exception string.h"
void menu()
{
cout
<<endl<<"1-Encryption"
<<endl<<"2-Decryption"
<<endl<<"3-Exit"
<<endl;
}
void main ()
{
int choice;
Vigener cryptosystem;
string word, key;
cout << "Welcome. This program for encryprion\\decryption.Alphabet only a..z" << endl;
do
{
cout << "Choice: ";
menu();
cin >> choice;
switch(choice)
{
case 1:
{
cout << "Enter word: ";
cin >> word;
word=e_str(word);
cout << "Enter key: ";
cin >> key;
key=e_str(key);
cout << endl << cryptosystem.enCrytrion(word, key) << endl;
break;
}
case 2:
{
cout << "Enter word: ";
cin >> word;
word=e_str(word);
cout << "Enter key: ";
cin >> key;
key=e_str(key);
cout << endl << cryptosystem.deCrytrion(word, key) << endl;
break;
}
default:if (choice!=3) cout << endl << "Error. Try again!"<<endl;break;
}
}
while (choice!=3);
}
//Exception
#include <string>
#include <iostream>
using namespace std;
string e_str(string str)
{
int size=str.length();
try
{
for (int i=0; i<size; i++)
{
if (str[i]<'a' || str[i]>'z')
{
throw std::out_of_range("Error. Out of range alphabet.");
break;
}
}
}
catch(std::out_of_range &error)
{
system("cls");
cout <<error.what() << endl;
exit(0);
}
return str;
}
// Заголовочный файл
#ifndef vigener
#define vigener
#include <string>
#include <cstring>
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;
class Vigener
{
private:
char *codeChar;
//Создание кодовой строки
string keyWord(int size, string key);
//Создание массива
void createAlp();
//Получение номера буквы в массиве соответствий
int inNum(char ch);
//Получение символа по номеру
char inChar(int num);
public:
Vigener();
~Vigener();
string deCrytrion (string word, string key);
string enCrytrion (string word, string key);
};
#endif
//Тела функций
#include "vigener.h"
#define max 26
#define ascii 97
Vigener::Vigener()
{
createAlp();
}
Vigener::~Vigener()
{
delete [] codeChar;
}
void Vigener::createAlp()
{
// Массив соответствий. Каждому индексу массива
// присваивается буква англ.алфавита.
codeChar=new char[max];
for (int i=0; i<max; i++)
{
codeChar[i]=char(ascii+i);
}
}
int Vigener::inNum(char ch)
{
int i=0;
while (codeChar[i]!=ch)
{
i++;
}
return i++;
}
char Vigener::inChar(int num)
{
return char(ascii+num);
}
string Vigener::keyWord(int size, string key)
{
string code;
for (int i=0; i<size/key.length(); i++)
{
code+=key;
}
for (int i=0; i<size%key.length(); i++)
{
code+=key.c_str()[i];
}
return code;
}
string Vigener::enCrytrion (string word, string key)
{
int size = word.length();
char *buf = new char[size];
string code, memory=key;
//-------------------------------------
//Создание ключевой строки для шифра
//-------------------------------------
size = word.length();
key=keyWord(size,key);
//-------------------------------------
//Шифрование сообщения
//-------------------------------------
int i=0;
while (size!=i)
{
code+=inChar((inNum(word.c_str()[i])+inNum(key.c_str()[i])) % 26);
i++;
}
//-------------------------------------
//Востановление ключа
key=memory;
return code;
}
string Vigener::deCrytrion (string word, string key)
{
string code, memory=key;
int size = word.length();
key=keyWord(size,key);
//Дешифровка
for (int i=0; i<size; i++)
{
code+=inChar((inNum( word[i]) - inNum(key[i]) + max ) % max);
}
//Востановление ключа
key=memory;
return code;
}
Результаты работы программы
Welcome. This program for encryprion\decryption.Alphabet only a..z
Choice:
1-Encryption
2-Decryption
3-Exit
1
Enter word: fizikotehnicheskii
Enter key: fizika
kqyquoymgvscmmrssi
Choice:
1-Encryption
2-Decryption
3-Exit
3
Press any key to continue . . .
________________________________________________________________________
Welcome. This program for encryprion\decryption.Alphabet only a..z
Choice:
1-Encryption
2-Decryption
3-Exit
1
Enter word: programming
Enter key: oop
dfdufpaaxbu
Choice:
1-Encryption
2-Decryption
3-Exit
2
Enter word: dfdufpaaxbu
Enter key: oop
programming
Choice:
1-Encryption
2-Decryption
3-Exit
3
Press any key to continue . . .