98929

Исследование и программная реализация шифра Виженера

Курсовая

Информатика, кибернетика и программирование

Исследовать схему шифрования «шифр Виженера» и создать программу на языке программирования высокого уровня, позволяющую зашифровать и дешифровать сообщение. Осуществить ручной пересчет шифрования и подтвердить его работой программы.

Русский

2016-07-14

2.93 MB

1 чел.

Министерство  образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

Российский государственный гидрометеорологический университет

Кафедра ИТ и СБ

Курсовой проект

по дисциплине: «Криптографические методы защиты информации»

на тему:

«Исследование и программная реализация шифра Виженера»

Выполнил: ст. гр. ИБ-Шеванов А.В.

Проверила:

Татарникова Т.М.

Санкт-Петербург.

2013 год.


Задание на курсовое проектирование по дисциплине «Криптографические методы защиты информации»

Исследовать схему шифрования «шифр Виженера» и создать программу на языке программирования высокого уровня, позволяющую зашифровать и дешифровать сообщение. Осуществить ручной пересчет шифрования и подтвердить его работой программы.

Содержание проекта:

  1.  Cведения о криптографии и шифре ;
  2.  Структурная схема алгоритма;
  3.  Пример шифрования;
  4.  Листинг программы;
  5.  Контрольный пример, выполненный данной программой;
  6.  Выводы по использованию шифра;
  7.  Список использованных источников.

Дата выдачи «____»    февраль  2013г.

Дата сдачи «____»    май 2013 г.

Задание выдал                                                                 Татарникова Т.М.

Задание получил                                                              ИБ-429: Шеванов А.В.

                                                                         

Санкт - Петербург

2013 г.


Оглавление

[1]
Введение

[2]
Шифр виженера.

[3]
Демонстрация работы программы

[4]
Общий вывод

[5]
Список используемой литературы


Введение

Криптогра́фия (от др.-греч. κρυπτός — скрытый и γράφω — пишу) — наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.

Потребность шифровать и передавать шифрованные сообщения возникла очень давно. Так, еще в V-IV вв. до н. э. греки применяли специальное шифрующее устройство. Первые придуманные шифры относились к классу шифров «простая замена» или «подстановка». Это  «Квадрат Полибия», «Шифр Цезаря». Это такие шифры, в котором каждой букве алфавита соответствует буква, цифра, символ или какая-нибудь их комбинация. Термин "шифр" арабского происхождения. В начале XV в. арабы опубликовали энциклопедию "Шауба Аль-Аща", в которой есть специальный раздел о шифрах. В этой энциклопедии указан способ раскрытия шифра простой замены. Он основан на различной частоте повторяемости букв в тексте. В этом разделе есть перечень букв в порядке их повторяемости на основе изучения текста Корана. Заметим, что в русском тексте чаще всего встречается буква "О", затем буква "Е" и на третьем месте стоят буквы "И" и "А". Более точно: на 1000 букв русского текста в среднем приходится 90 букв "О", 72 буквы "Е" или "Ё" и по 60 букв "И" и "А" и т.д.

Неудобство шифров типа "подстановка" ("простая замена") в случае использования стандартного алфавита очевидно. Таблица частот встречаемости букв алфавита позволяет определить один или несколько символов, а этого иногда достаточно для дешифрования всего сообщения. Поэтому обычно пользуются разными приемами, чтобы затруднить дешифрование. Для этой цели используют многобуквенную систему шифрования – систему, в которой одному символу отвечает одна или несколько комбинаций двух и более символов. Другой прием – использование нескольких алфавитов. В этом случае для каждого символа употребляют тот или иной алфавит в зависимости от ключа, который связан каким-нибудь способом с самим символом или с его порядком в передаваемом сообщении. В процессе шифрования (и дешифрования) используется таблица ("таблица Виженера"), которая устроена следующим образом: в первой строке выписывается весь алфавит, в каждой следующей осуществляется циклический сдвиг на одну букву. Так получается квадратная таблица, число строк которой равно числу столбцов и равно числу букв в алфавите.


Шифр виженера.

Шифр Виженера — метод полиалфавитного шифрования буквенного текста с использованием ключевого слова.

Этот метод является простой формой многоалфавитной замены. Шифр Виженера изобретался многократно. Впервые этот метод описал Джован Баттиста Беллазо (итал. Giovan Battista Bellaso) в книге La cifra del. Sig. Giovan Battista Bellasо в 1553 году, однако в XIX веке получил имя Блеза Виженера, французского дипломата. Метод прост для понимания и реализации, он является недоступным для простых методов криптоанализа.

Блез Виженер представил своё описание простого, но стойкого шифра перед комиссией Генриха III во Франции в 1586 году, и позднее изобретение шифра было присвоено именно ему. Давид Кан в своей книге «Взломщики кодов» отозвался об этом осуждающе, написав, что история «проигнорировала важный факт и назвала шифр именем Виженера, несмотря на то, что он ничего не сделал для его создания».

Шифр Виженера имел репутацию исключительно стойкого к «ручному» взлому. Известный писатель и математик Чарльз Лютвидж Доджсон (Льюис Кэрролл) назвал шифр Виженера невзламываемым в своей статье «Алфавитный шифр» англ. The Alphabet Cipher, опубликованной в детском журнале в 1868 году. В 1917 году Scientific American также отозвался о шифре Виженера, как о неподдающемся взлому. Это представление было опровергнуто после того, как Касиски полностью взломал шифр в XIX веке, хотя известны случаи взлома этого шифра некоторыми опытными криптоаналитиками ещё в XVI веке.

Шифр Виженера достаточно прост для использования в полевых условиях, особенно если применяются шифровальные диски. Например, «конфедераты» использовали медный шифровальный диск для шифра Виженера в ходе Гражданской войны.

 Описание алгоритма

В шифре Цезаря каждая буква алфавита сдвигается на несколько строк; например в шифре Цезаря при сдвиге +3, A стало бы D, B стало бы E и так далее. Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для зашифровывания может использоваться таблица алфавитов, называемая tabula recta или квадрат (таблица) Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На разных этапах кодировки шифр Виженера использует различные алфавиты из этой таблицы. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова. 

Расшифровывание производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ, соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.

Если буквы A-Z соответствуют числам 0-25, то шифрование Виженера можно записать в виде формулы:

Расшифровка:

Криптоанализ

 Шифр Виженера «размывает» характеристики частот появления символов в тексте, но некоторые особенности появления символов в тексте остаются. Главный недостаток шифра Виженера состоит в том, что его ключ повторяется. Поэтому простой криптоанализ шифра может быть построен в два этапа:

  1.  Поиск длины ключа. Можно анализировать распределение частот в зашифрованном тексте с различным прореживанием. То есть брать текст, включающий каждую 2-ю букву зашифрованного текста, потом каждую 3-ю и т. д. Как только распределение частот букв будет сильно отличаться от равномерного (например, по энтропии), то можно говорить о найденной длине ключа.
  2.  Криптоанализ. Совокупность l шифров Цезаря (где l — найденная длина ключа), которые по отдельности легко взламываются.

Таблица Виженера для кириллицы:

Таблица Виженера для латиницы:

 


Листинг программы

unit Unit1;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TForm1 = class(TForm)

   Label1: TLabel;

   Label2: TLabel;

   Edit1: TEdit;

   Label3: TLabel;

   Edit2: TEdit;

   Button1: TButton;

   Button2: TButton;

   Label4: TLabel;

   Edit3: TEdit;

   Button3: TButton;

   procedure Button1Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure Button3Click(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 i, z, n, l, p : integer;

 s, k, e :string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);//---Кнопка зашифровки

begin

s:=Edit1.Text;  /--исходный текст

k:=Edit2.Text;     /--ключ

Edit3.Text:='';

for i:=1 to length(s) do

 begin

 z:=ord(s[i]);       /--перевод в ASCII код

 l:=length(k);

 p:=i;

  //--Циклическое считывание ключа

 if p>l then

   begin

    p:=(p)mod(l);

    if p=0 then p:=l

    else p:=p;

    end

   else p:=p;

 n:=ord(k[p]);

 //--Кириллица заглавные

 if ((z>=192) and (z<=223)) and ((n>=192) and (n<=255)) then

 begin

 z:=(z-191);

   if n>=224 then n:=n-223

   else n:=n-191;

 z:=((z+n)mod(32))+191-1;

 if z<192 then z:=z+32

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Кириллица строчнык

 else if ((z>=224) and (z<=255)) and ((n>=192) and (n<=255)) then

 begin

 z:=(z-223);

 if n>=224 then n:=n-223

 else n:=n-191;

 z:=223-1+(z+n)mod(32);

 if z<224 then z:=z+32

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Латиница заглавные

 else if ((z>=65) and (z<=90)) and (((n>=65) and (n<=90)) or ((n>=97) and (n<=122))) then

 begin

 z:=(z-64);

 if n>=97 then n:=n-96

 else n:=n-64;

 z:=64-1+(z+n)mod(26);

 if z<65 then z:=z+26

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Латиница сточные

 else if ((z>=97) and (z<=122)) and (((n>=65 )and (n<=90)) or ((n>=97) and (n<=122))) then

 begin

 z:=(z-96);

 if n>=97 then n:=n-96

 else n:=n-64;

 z:=96-1+(z+n)mod(26);

 if z<97 then z:=z+26

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Если шифруемое сообщение не входит в алфавит (.,! ? и т.д.)

 else if (z<65) or ((z>90) and (z<97)) or ((z>122) and (z<192)) and (((n>64) and (n<91)) or ((n>96) and (n<123)) or (n>191)) then

 Edit3.Text:= Edit3.Text+chr(z)

 //--Если в ключ входят символы не из алфавита (.,! ? и т.д.)

 else if (n<65) or ((n>90) and (n<97)) or ((n>122) and (n<192)) then

 begin

 ShowMessage('Введен некорректный ключ. Ключ не должен содержать символы');

 Edit3.Text:='';

 break;

 end

 //---Использование разных алфавитов

 else

 begin

 ShowMessage('Ключ и текст должны содержать символы из одного алфавита');

 Edit3.Text:='';

 break;

 end;

end;

 end;

procedure TForm1.Button2Click(Sender: TObject);//-- Кнопка расшифровки

begin

Edit3.Text:='';  

s:=Edit1.Text;

k:=Edit2.Text;

for i:=1 to length(s) do

 begin

 z:=ord(s[i]);

 l:=length(k);

 p:=i;

  //--Циклическое считывание ключа

 if p>l then

   begin

    p:=(p)mod(l);

    if p=0 then p:=l

    else p:=p;

    end

   else p:=p;

 n:=ord(k[p]);

 //--Кириллица заглавные

 if ((z>=192) and (z<=223)) and ((n>=192) and (n<=255)) then

 begin

 z:=(z-191);

   if n>=224 then n:=n-223

   else n:=n-191;

 z:=((z-n)mod(32))+191+1;

 if z<192 then z:=z+32

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Кириллица строчнык

 else if ((z>=224) and (z<=255)) and ((n>=192) and (n<=255)) then

 begin

 z:=(z-223);

 if n>=224 then n:=n-223

 else n:=n-191;

 z:=223+1+(z-n)mod(32);

 if z<224 then z:=z+32

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Латиница заглавные

 else if ((z>=65) and (z<=90)) and (((n>=65) and (n<=90)) or ((n>=97) and (n<=122))) then

 begin

 z:=(z-64);

 if n>=97 then n:=n-96

 else n:=n-64;

 z:=64+1+(z-n)mod(26);

 if z<65 then z:=z+26

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Латиница сточные

 else if ((z>=97) and (z<=122)) and (((n>=65 )and (n<=90)) or ((n>=97) and (n<=122))) then

 begin

 z:=(z-96);

 if n>=97 then n:=n-96

 else n:=n-64;

 z:=96+1+(z-n)mod(26);

 if z<97 then z:=z+26

 else z:=z;

 Edit3.Text:= Edit3.Text+chr(z);

 end

 //--Если шифруемое сообщение не входит в алфавит (.,! ? и т.д.)

 else if (z<65) or ((z>90) and (z<97)) or ((z>122) and (z<192)) and (((n>64) and (n<91)) or ((n>96) and (n<123)) or (n>191)) then

 Edit3.Text:= Edit3.Text+chr(z)

 //--Если в ключ входят символы не из алфавита (.,! ? и т.д.)

 else if (n<65) or ((n>90) and (n<97)) or ((n>122) and (n<192)) then

 begin

 ShowMessage('Введен некорректный ключ. Ключ не должен содержать символы');

 Edit3.Text:='';

 break;

 end

 //---Использование разных алфавитов

 else

 begin

 ShowMessage('Ключ и текст должны содержать символы из одного алфавита');

 Edit3.Text:='';

 break;

 end;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

Close();

end;

end.

//-------------------------------------------------------------------------


Демонстрация работы программы

 Рис.1 Диалоговое окно программы.

Для начала работы программы в поле «Исходный текст» следует записать открытое сообщение, в поле «Ключ» записать ключ шифрования. Нажать кнопку «Зашифровать». В качестве контрольного примера выбрана цитата «Дайте человеку цель, ради которой стоит жить, и он сможет выжить в любой ситуации», а в качестве ключа используется имя автора этих слов «ИоганнГете».

Открытое сообщение: «Дайте человеку цель, ради которой стоит жить, и он сможет выжить в любой ситуации».

Ключ: «ИоганнГете».

 Рис.2 Пример шифрования

Получено зашифрованное сообщение: «Момтт ъкэукуну гиро, югдх нудушьм юяснд оцхь, л ат япоутх фаоцхь п рржцч схяцеинр».  Для дешифрования зашифрованный текст следует записать в поле «Текст» и нажать кнопку «Расшифровать»

 

Рис.3 Пример дешифрования.

Для корректной работы программы должны выполняться следующие условия:

  1.  Исходный текст и ключ должны быть из одного алфавита.
  2.  Ключ не должен содержать сиволов не из алфавита, т.е не должен содержать знаков препинания, пробелов и т.п.

При не выполнении условий появятся сообщения (Рис.4, Рис.5).

Рис.4. Использование разных алфавитов

Рис. 5. Использование пробела в ключе шифрования.


Общий вывод

В проделанной работе был программно реализован шифр «Виженера». Данная программа написана в программной среде Delphi 7. Программа осуществляет шифрование и дешифрование текста написанного на одном из двух алфавитов – кириллица, латиница. Для корректной работы программы шифруемое сообщение и ключ должны содержать в себе символы из одного алфавита. Так же ключ не должен содержать в себе пробелов, знаков пунктуации и иных символов не входящих в алфавит. Данный шифр долго считался криптоскойким к ручному взлому так как метод шифрования скрывает частоту появления символов связанную с особенностями языка. Это обусловлено тем что один символ может быть заменен на любой символ алфавита в зависимости от ключа. Так же стойкость этого алгоритма повышается с длинной ключа. Максимально стойким алгоритм будет при соизмеримости ключа и исходного текста.

 


Список используемой литературы

  1.  Курс лекций «Криптография» Татарникова Т.М.
    1.  http://www.ddt.cs.vsu.ru/?q=system/files/03.pdf.
    2.  http://ru.wikipedia.org/wiki/ Шифр_Виженера .


 

А также другие работы, которые могут Вас заинтересовать

18113. Классификация типов меню 77.5 KB
  Меню Классификация типов меню При создании окна в приложении Windows можно указать что окно должно иметь меню. Обычно меню создается в главном окне приложения. Такое меню называется меню приложения. Меню содержит отдельные элементы или строки File Edit View и т. д. рас
18114. Рисование геометрических фигур 146.5 KB
  Рисование точки Функция рисования точки SetPixel устанавливает цвет точки с заданными координатами: COLORREF WINAPI SetPixel HDC hdc // контекст отображения int nXPos // xкоордината точки int nYPos // yкоордината точки COLORREF clrref; // цвет точки Параметр hdc
18115. Об’єктно-реляційні перетворення (O/RM – Object-relational mapping) 83 KB
  Об’єктнореляційні перетворення O/RM – Objectrelational mapping //Реляційні бази даних; проблеми зв’язку реляційних БД з ООПпрограмами} Об’єктноорієнтовані бази даних і СУБД ODBMS Object database management system Поряд з реляційними базами даних РБД в яких інформація зберігається у вигл...
18116. Поняття бізнес-логіки. Java EE 70.5 KB
  Тема 1: Поняття бізнеслогіки. Java EE Поняття бізнеслогіки Загальна задача роботи програми роботи з базою даних – читати з бази даних інформацію і показувати її користувачеві часто в обробленому вигляді і записувати в базу інформацію введену користувачем часто в обро
18117. Технологія Java Servlet 52.5 KB
  Тема 2: Технологія Java Servlet Сервлет Javaоб’єкт що працює всередині спеціальної програми сервлетконтейнера і застосовується для динамічного генерування даних. Кожен сервлет описується в окремому класі який реалізує інтерфейс Servlet. В більшості сервлети використовуються...
18118. JSP (Java Server Pages ) 97 KB
  Тема 3: JSP Java Server Pages Технологія Java Server Pages JSP є складовою частиною єдиної технології створення програм на основі технології J2EE з використанням webінтерфейсу. JSP це альтернативна технології Java Servlet методика розробки програм що динамічно генерують відповідь на ті або інш...
18119. Вступ до технології Enterprise JavaBeans 50 KB
  Тема 4: Вступ до технології Enterprise JavaBeans Java Platform Enterprise Edition чи Java EE раніше відома як Java 2 Platform Enterprise Edition чи J2EE до версії 1.5 – це програмна платформа частина Javaплатформи для розробки і запуску розподілених Javaпрограм з багаторівневою архітектурою що базуються на ком
18120. Транзакції в мові SQL 88.5 KB
  Тема 5: Транзакції в мові SQL Що таке транзакція Транзакція transaction може бути визначена як логічна послідовність операцій над даними яка розглядається як окрема цілісна частина роботи. У транзакції робляться або всі зміни або жодної. Транзакції підтримують ACIDвластиво
18121. Збережені процедури в Interbase/Firebird 52.5 KB
  Тема 6: Збережені процедури в Interbase/Firebird Збережені процедури Stored procedures – це програми які зберігаються в метаданих бази даних і виконуються на сервері. Прикладні програми можуть викликати stored procedure для виконання заданих в них операцій. Є два види збережених процеду