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

Metod_Vizhenera_savenkov_Ivan_Kn-1_2-Kurs / Отчёт(Виженер)

.docx
Скачиваний:
22
Добавлен:
13.04.2015
Размер:
255.84 Кб
Скачать

Отчет

по алгоритму шифрования

Метод замены. Шифр Виженера

Подготовил студент

группы КН-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 . . .