Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гусев Евгений Курсовая работа 30 11 2011.doc
Скачиваний:
1
Добавлен:
29.07.2019
Размер:
458.24 Кб
Скачать

История и применение

Первое точное документированное описание многоалфавитного шифра было сформулированно Леоном Баттиста Альберти в 1467 году, для переключения между алфавитами использовался металлический шифровальный диск. Система Альберти переключает алфавиты после нескольких зашифрованных слов. Позднее, в 1518 году, Иоганн Трисемус в своей работе «Полиграфия» изобрел tabula recta — центральный компонент шифра Виженера.

То, что сейчас известно под шифром Виженера, впервые описал Джованни Батиста Беллазо в своей книге La cifra del. Sig. Giovan Battista Bellasо. Он использовал идею tabula recta Трисемуса, но добавил ключ для переключения алфавитов шифра через каждую букву. [6]

    1. Актуальность темы

Проблема шифрования и дешифрования текстовых сообщений сейчас особенно актуальна. Как мы уже узнали из написанного выше, на протяжении многих веков шифрование применяется для защиты информации от попадания в круг лиц, которому она не адресована. На сегодняшний день существует огромное множество зашифрованных документов, файлов и иной информации, принадлежащих разным странам мира, разным эпохам и написанных по разным причинам. Написанная мной программа объединит в себе пять методов шифрования, а также дешифрования текстовых сообщений, что, при дальнейшем её использовании, даст возможность глубже заглянуть в мир, полный зашифрованных документов, будь то античные письмена, средневековые документы или современные источники особой секретности. Одним из путей применения данной программы может явиться дешифрование вышеуказанных материалов.

    1. Цель работы

Целью данной работы являются:

      1. Углубление знаний и расширение навыков по разработке алгоритмов и их реализации на персональном компьютере.

      2. Создание программы, способной зашифровывать и расшифровывать вводимый текст пятью способами:

  • Методом Атбаш

  • Шифром Цезаря

  • Квадратом Полибия

  • Методом Гронсфельда

  • Методом Виженера

    1. Задачи работы

Задачами данной работы являются:

  1. Изложение материала по теме «шифрование и дешифрование текста пятью разными методами»

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

  3. Описание программы

  4. Составление блок-схемы, характеризующей работу программы

  5. Составление и испытание программы шифрующей и дешифрующей текст пятью различными методами

2.1 Описание работы программы.

Программа разработана на языке программирования Pascal и состоит главным образом из девяти функций:

function Atbash (…)

function CaesarEncipher (…)

function CaesarDecipher (…)

function PolibiusEncipher (…)

function PolibiusDecipher (…)

function GronsfeldEncipher (…)

function GronsfeldDecipher (…)

function ViginerEncipher (…)

function ViginerDecipher (…)

Функция ( Function(…) ) - это часть программы, которая вычисляет и возвращает значение.

Каждая из функций вычисляет и возвращает значение для определённого метода шифрования или дешифрования, в зависимости от того, какой метод выбран.

Программа устроена так, что выбрать определённый метод можно при помощи условного оператора.

Условный оператор (if) реализует выполнение определённых команд при условии, что некоторое логическое выражение (условие) принимает значение «истина» true.

Часть программы, включающую оператор if , с помощью которого программа обращается к нужной функции, передаёт ей значение и возвращает после вычисления, представлена ниже в пункте №7.

2.1.1 Этапы работы программы

  1. При запуске программы процедура writeln выводит на экран сообщение 'Введите номер интересующего метода шифрования:1-Атбаш,2-Цезарь,3-Полибий,4-Гронсфельд,5-Виженер';

  2. Процедура read считывает переменную m:real (тип данных- вещественные числа);

  3. Процедура writeln выводит на экран сообщение 'Введите слово';

  4. Процедура readln считывает переменную word:string (буквенного типа);

  5. Процедура writeln выводит на экран сообщение '1-зашифровать/2-расшифровать ';

  6. Процедура readln считывает переменную k:real (тип данных-вещественные числа);

  7. Все переменные считаны - реализуется условный оператор:

если m=1, то проверяется k:

если к=1, то переменной s возвращается значение, полученное функцией от переменной word s := Atbash(word), и оператор writeln выводит ('Шифрование элемента ',s);

если к<>1,то переменной s возвращается значение, полученное функцией от переменной word s := Atbash(word), и оператор writeln выводит ('Расшифровывание элемента ', s);

Далее по аналогии:

m=2, k=1 - s := CaesarEncipher(word);

writeln('Шифрование элемента ',s)

k<>1 - s := CaesarDecipher(word);

writeln('Расшифровывание элемента ',s);

m=3, k=1 - s := PolibiusEncipher(word);

writeln('Шифрование элемента ',s)

k<>1 - s := PolibiusDecipher(word);

writeln('Расшифровывание элемента ',s);

m=4, k=1 - s := GronsfeldEncipher(word, '2178');

writeln('Шифрование элемента ',s)

k<>1 - s := GronsfeldDecipher(word, '2178');

writeln('Расшифровывание элемента ',s);

m=5, k=1 - s := ViginerEncipher(word, 'BORED');

writeln('Шифрование элемента ',s);

k<>1 - s := ViginerDecipher(word, 'BORED');

writeln('Расшифровывание элемента ',s);

Программа выполнена, с помощью функций текст преобразован и выведен на экран операторами.

2.1.2 Подробнее о программе. Использованные функции и процедуры

Функция chr (X) - возвращает символ с определенным номером в ASCII таблице. Function Chr(X : Byte) : Char.

Функция ord (X) - возвращает порядковый номер значения выражения порядкового типа (нумерация начинается с нуля)

function Ord(x: <порядковый тип>): Longint;

X - выражение любого порядкового типа.

Процедура Inc - увеличивает значение переменной

Procedure Inc(Var X [ ; N : Longint ] ).

Параметр X - переменная перечислимого типа или переменная типа PChar, если допускается расширенный синтаксис, а N - выражение целочисленного типа. Значение X увеличивается на 1, если параметр N не определен, или на N, если праметр N определен, то есть Inc(X) соответствует X:=X+1, а Inc(X, N) соответствует X:=X+N.

Процедура Dec- уменьшает значение переменной

Procedure Dec(Var X[ ; N : Longint]).

По аналогии с процедурой Inc.

Функция Succ возвращает следующий элемент параметра.

Function Succ(X) : (тип параметра).

Параметр X в функции Succ является выражением перечислимого типа. Значение результата вызова функции Succ будет того же типа, что и X, так как является последователем X.

Succ('A') = 'B'

Pred (функция)- возвращает предшественника параметра.

Function Pred(X) : < тип параметра >;

По аналогии с функцией Succ.

Function Pos(Substr : String; S : String) : Byte; -ищет подстроку в строке.

Параметры Substr и S - строковые выражения. Pos ищет первое вхождение строки Substr в строку S и возвращает целочисленное значение, которое является индексом первого символа Substr внутри S. Если строка Substr не найдена, то Pos возвращает нуль. [7]

2.1.3 Работа основных функций в программе

  1. Все функции получают буквенное значение переменной word, далее:

function Atbash

Служит для шифрования и дешифрования методом Атбаш.

Запускается цикл, в котором каждой букве присваивается новое значение из таблицы ASCII. Функция ord возвращает символу под номером i его номер из таблица ASHII, далее этот номер вычитается из 219, если символ принадлежит определённому промежутку (219=97+122, т.е. равен сумме номеров символа a и z; 155=65+90, сумма номеров символов Z и a). В следующем действии функция chr возвращает символьный эквивалент получившемуся числу.

Функция выглядит следующим образом:

function Atbash(toCode: string): string;

var i: integer;

begin

for i := 1 to length(toCode) do

if ((toCode[i]>='a') and (toCode[i]<='z'))

then toCode[i]:=Chr(219-Ord(toCode[i]));

if ((toCode[i]>='A') and (toCode[i]<='Z'))

then toCode[i]:=Chr(155-Ord(toCode[i]));

Atbash := toCode;

end;

function CaesarEncipher (…)

Служит для шифрования методом Цезаря.

Запускается цикл, в котором каждой букве присваивается новое значение из таблицы ASCII. Функция ord возвращает символу под номером i его номер из таблица ASHII, далее к этому номеру прибавляется число 3, тем самым осуществляется «сдвиг» порядкового номера на 3 позиции вправо.

Функция выглядит следующим образом:

function CaesarEncipher(toCode: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr((Ord(toCode[ i ]) + 3));

end;

CaesarEncipher := toCode;

end;

function CaesarDecipher (…)

Служит для дешифрования методом Цезаря.

Процесс аналогичен шифрованию, но «сдвиг» элемента осуществляется на 3 позиции влево.

Функция выглядит следующим образом:

function CaesarDecipher(toDecode: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr((Ord(toDecode[ i ]) - 3));

end;

CaesarDecipher := toDecode;

end;

function PolibiusEncipher (…)

Служит для шифрования методом Полибия.

Запускается цикл, в котором каждой букве присваивается новое значение, состоящее из двух символов ix и jx, где оба символа берутся из первой строки: ix соответствует номеру строки элемента, jx номеру столбца.

Функция выглядит следующим образом:

function PolibiusEncipher(toCode: string): string;

var

i: integer;

ix, jx: char;

s: string;

begin

s := '';

for i := 1 to length(toCode) do begin

for ix := 'A' to 'H' do

for jx := 'A' to 'H' do

if TPolibius[ix, jx] = toCode[ i ] then begin

s := s + ix + jx;

break;

end;

end;

PolibiusEncipher := s

end;

function PolibiusDecipher (…)

Служит для дешифрования методом Полибия.

Запускается цикл while, в котором берётся первый символ, выражения требующего дешифровки (он представляет строку исходного символа), затем второй символ (он представляет столбец исходного символа). После этого в массиве TViginer на пересечении строки и столбца берётся нужный элемент. (Функция succ возвращает следующее буквенное значение, т.к. при шифровании элемент заменяется двумя символами, идущими подряд. Функция inc увеличивает величину на 2 ).

TViginer: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz';

TPolibius: array['A' .. 'H','A' .. 'H'] of char = (

('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', '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', '1', '2', '3', '4'),

('5', '6', '7', '8', '9', '_', '+', '-') );

Функция выглядит следующим образом:

function PolibiusDecipher(toDecode: string): string;

var

i: integer;

s: string;

begin

s := '';

i := 1;

while i <= length(toDecode) do begin

s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];

inc(i, 2);

end;

PolibiusDecipher := s

end;

function GronsfeldEncipher (…)

Служит для шифрования методом Гронсфельда.

Запускается цикл for, в котором зашифрованный элемент образуется засчёт присвоения первоначальному элементу номера, равного сумме номера этого элемента, номера символа ключа и разности номера элемента «0», т.к. он идёт перед порядковым номером символа ключа (из таблицы ASCHII).

Функция выглядит следующим образом:

function GronsfeldEncipher(toCode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr(Ord(toCode[ i ])+(Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0')));

end;

GronsfeldEncipher := toCode;

end;

function GronsfeldDecipher (…)

Служит для дешифрования методом Гронсфельда.

Принцип аналогичен шифрованию, с разницей в том, что сдвиг, образованный ключом в данном случае снимается.

Функция выглядит следующим образом:

function GronsfeldDecipher(toDecode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr(Ord(toDecode[i])-(Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0')));

end;

GronsfeldDecipher := toDecode;

end;

function ViginerEncipher (…)

Служит для шифрования методом Виженера.

Запускается цикл, в котором новое значение символа получается благодаря:

в начале использованию переменной, которой присваивается значение, равное номеру элемента, вычисленного функцией pos (функция pos ищет первое пересечение буквы кодового слова и массива TViginer, затем выдаёт номер данного элемента в массиве), минус 1

конечный элемент берётся из массива TViginer. Его номер равен номеру элемента пересечения символа вводимого текста минус 1, прибавить подсчитанную выше переменную, взять целую часть от деления всего этого на длину массива (52 символа) и прибавить 1.

Функция выглядит следующим образом:

TViginer: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz';

function ViginerEncipher(toCode, K: string): string;

var

i: integer;

currK: byte;

s: string;

begin

s := '';

for i := 1 to length(toCode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

s := s + TViginer[ ((pred(pos(toCode[ i ], TViginer)) + currK) mod length(TViginer))+1];

end;

ViginerEncipher := s;

end;

function ViginerDecipher (…)

Служит для дешифрования методом Виженера.

Отличается от предыдущего шифрования номером символа, берущегося из массива. Он равен номеру пересечения элемента, уменьшенному на значение подсчитанной ранее переменной.

Функция выглядит следующим образом:

function ViginerDecipher(toDecode, K: string): string;

var

i, T: integer;

currK: byte;

s: string;

begin

s := '';

for i := 1 to length(toDecode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

T := pred(pos(toDecode[ i ], TViginer)) - currK;

I f T < 0 then inc(T, length(TViginer));

s := s + TViginer[T + 1];

end;

ViginerDecipher := s;

end;

  1. Все функции возвращают переменную toCode или toDecode в значении s.

2.1.4 Блок-схемы

s := Atbash(word);

s := Atbash(word);

s := CaesarEncipher(word);

s := CaesarDecipher(word);

s := PolibiusEncipher(word);

s := PolibiusDecipher(word);

s := ViginerEncipher(word, 'BORED');

s := ViginerDecipher (word, 'BORED');

s := GronsfeldEncipher(word, '2178');

s := ViginerEncipher(word, 'BORED');

s := GronsfeldDecipher (word, '2178');

s := ViginerDecipher (word, 'BORED');

      1. Текст программы

program shifrovanie;

var l:real;

const

TViginer: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz';

TPolibius: array['A' .. 'H','A' .. 'H'] of char = (

('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', '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', '1', '2', '3', '4'),

('5', '6', '7', '8', '9', '_', '+', '-'));

function Atbash(toCode: string): string;

var i: integer;

begin

for i := 1 to length(toCode) do

if ((toCode[i]>='a') and (toCode[i]<='z'))

then toCode[i]:=Chr(219-Ord(toCode[i]));

if ((toCode[i]>='A') and (toCode[i]<='Z'))

then toCode[i]:=Chr(155-Ord(toCode[i]));

Atbash := toCode;

end;

function CaesarEncipher(toCode: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr((Ord(toCode[ i ]) + 3));

end;

CaesarEncipher := toCode;

end;

function CaesarDecipher(toDecode: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr((Ord(toDecode[ i ]) - 3));

end;

CaesarDecipher := toDecode;

end;

function PolibiusEncipher(toCode: string): string;

var

i: integer;

ix, jx: char;

s: string;

begin

s := '';

for i := 1 to length(toCode) do begin

for ix := 'A' to 'H' do

for jx := 'A' to 'H' do

if TPolibius[ix, jx] = toCode[ i ] then begin

s := s + ix + jx; break;

end;

end;

PolibiusEncipher := s

end;

function PolibiusDecipher(toDecode: string): string;

var

i: integer;

s: string;

begin

s := '';

i := 1;

while i <= length(toDecode) do begin

s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];

inc(i, 2);

end;

PolibiusDecipher := s

end;

function GronsfeldEncipher(toCode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toCode) do begin

toCode[ i ] := Chr(Ord(toCode[ i ])+(Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0')));

end;

GronsfeldEncipher := toCode;

end;

function GronsfeldDecipher(toDecode, K: string): string;

var i, T: integer;

begin

for i := 1 to length(toDecode) do begin

toDecode[ i ] := Chr(Ord(toDecode[i])-(Ord(K[(pred(i) mod length(K)) + 1]) - Ord('0')));

end;

GronsfeldDecipher := toDecode;

end;

function ViginerEncipher(toCode, K: string): string;

var

i: integer;

currK: byte;

s: string;

begin

s := '';

for i := 1 to length(toCode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

s := s+TViginer[ ((pred(pos(toCode[ i ], TViginer)) + currK) mod length(TViginer)) + 1 ];

end;

ViginerEncipher := s;

end;

function ViginerDecipher(toDecode, K: string): string;

var

i, T: integer;

currK: byte;

s: string;

begin

s := '';

for i := 1 to length(toDecode) do begin

currK := pred(pos(K[ (pred(i) mod length(K)) + 1 ], TViginer));

T := pred(pos(toDecode[ i ], TViginer)) - currK;

if T < 0 then inc(T, length(TViginer));

s := s + TViginer[T + 1];

end;

ViginerDecipher := s;

end;

var

s: string;

word: string;

m: real;

k: real;

begin

writeln('Введите номер интересующего метода шифрования:1-Атбаш,2-Цезарь,3-Полибий,4-Гронсфельд,5-Виженер');

readln(m);

writeln('Введите слово');

readln(word);

writeln('1-зашифровать/2-расшифровать ');

readln(k);

if m=1 then begin

if k=1 then begin

s := Atbash(word);

writeln('Шифрование элемента ',s);

end

else begin

s := Atbash(word);

writeln('Расшифровывание элемента ', s);

end;

end;

if m=2 then begin

if k=1 then begin

s := CaesarEncipher(word);

writeln('Шифрование элемента ',s)

end

else begin

s := CaesarDecipher(word);

writeln('Расшифровывание элемента ',s);

end;

end;

if m=3 then begin

if k=1 then begin

s := PolibiusEncipher(word);

writeln('Шифрование элемента ',s)

end

else begin

s := PolibiusDecipher(word);

writeln('Расшифровывание элемента ',s);

end;end;

if m=4 then begin

if k=1 then begin

s := GronsfeldEncipher(word, '2178');

writeln('Шифрование элемента ',s)

end

else begin

s := GronsfeldDecipher(word, '2178');

writeln('Расшифровывание элемента ',s);

end;

end;

if m=5 then begin

if k=1 then begin

s := ViginerEncipher(word, 'BORED');

writeln('Шифрование элемента ',s)

end

else begin

s := ViginerDecipher(word, 'BORED');

writeln('Расшифровывание элемента ',s);

end;end;end.

2.1.6 Скриншоты

Попробуем зашифровать и расшифровать слово «Политех» каждым из пяти методов шифрования, получим:

Рисунок 7 – Скриншот тестирования функций «Атбаш», «Цезарь»

Рисунок 8 – Скриншот тестирования функций «Полибий», «Гронсфельд», «Виженер»

Вывод: зашифрованные и расшифрованные данные полностью совпадают.

ОСНОВЫЕ РЕЗУЛЬТАТЫ РАБОТЫ

Основными результатами работы стали:

1. Изложение материала по теме «шифрование и дешифрование текста пятью разными методами».

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

3. Описание программы

4. Составление блок-схемы, характеризующей работу программы

5. Составление и испытание программы шифрующей и дешифрующей текст пятью различными методами

Выводы:

Я обрёл навыки работы в среде программирования Pascal. Результатом моей работы стала программа «Шифрование и дешифрование текста пятью методами».

СПИСОК ИСПОЛЬЗОВАННЫХ ИНФОРМАЦИОННЫХ ИСТОЧНИКОВ

  1. Web: http://www.realcoding.net/article/view/

  2. Web: http://ru.wikipedia.org/wiki/Шифр_подстановки

  3. Web: http://ru.wikipedia.org/wiki/Шифр_Цезаря

  4. Web: http://ru.wikipedia.org/wiki/Квадрат_Полибия

  5. Web: http://ru.wikipedia.org/wiki/Полиалфавитный_шифр

  6. Web: http://ru.wikipedia.org/wiki/Шифр_Виженера

  7. Л.Д. Михелев. «Язык программирования паскаль» издательство.

Москва, 2007. – 432с.:ил.

  1. Web: http://www.asciitable.com/

  2. Web: http://pascal-video.ru/help-pascal.php?id=215

  3. Web: http://www.cyberforum.ru/pascal/thread50710.html

  4. Фарафонов В.В. Турбо Паскаль 7.0. Начальный курс: учеб. пособие. - М.: Кнорус, 2006.

  5. Методические указания к лабораторным работам. ГОУВПО «воронежский государственный технический университет»; сост. Р.В.Батищев. Воронеж, 2006. 53с.

36

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]