Лабораторные работы / Методические указания к ЛР по ОАИП (09.02.07)
.pdfF |
|
I |
|
M |
|
P |
|
T |
|
W |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
G |
|
J |
|
N |
|
Q |
|
U |
|
X |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Математическая модель шифра Цезаря записывается в виде (1) |
||||||||||||||
|
|
|
С = ( + ) (1) |
|
(1) |
|
где C – код символа шифротекста, P – код символа открытого текста, К – коэффициент
сдвига, M – размер алфавита, mod – операция нахождения остатка от деления на М.
Например, результатом шифрования открытого текста RED APPLE по методу Цезаря с ключом К = 3 будет являться последовательность UHG ASSOH.
2.2. Простая моноалфавитная замена
Шифр простой моноалфавитной замены является обобщением шифра Цезаря, и
его математическая модель записывается в виде (2)
= + ( ) (2)
где ≥ 0, < – ключ шифрования, НОД( , ) = 1.
Преобразование согласно схеме (2) является взаимно однозначным отображением только в том случае, если a и M взаимно простые. В этом случае для дешифрования закрытого текста выполняют обратное преобразование по формуле (3)
= −1 ( − )( ) (3)
Пример.
Пусть = 26, = 3, = 6, НОД(3,26) = 1. Тогда получаем следующую таблицу подстановок для шифра простой моноалфавитной замены.
|
A |
B |
C |
D |
E |
F |
G |
H |
I |
G |
K |
L |
M |
N |
O |
P |
Q |
R |
S |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
C |
6 |
9 |
12 |
15 |
18 |
21 |
24 |
1 |
4 |
7 |
10 |
13 |
16 |
19 |
22 |
25 |
2 |
5 |
8 |
|
T |
U |
V |
W |
X |
Y |
Z |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
|
|
|
|
|
|
|
|
|
|
|
|
C |
11 |
14 |
17 |
20 |
23 |
0 |
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тогда открытый текст «HOME» будет преобразован в шифротекст «BWQS».
2.3. Метод простой перестановки
При шифровании методом простой перестановки производят деление открытого текста на блоки одинаковой длины, равной длине ключа. Ключ длины n представляет собой последовательность неповторяющихся чисел от 1 до . Символы открытого текста внутри каждого из блоков переставляют в соответствие с символами ключа внутри блока справа налево. Элемент ключа в заданной позиции блока говорит о том,
301
что на данное место будет помещен символ открытого текста с номером из соответствующего блока.
Зашифруем открытый текст «ПРИЕЗЖАЮДНЕМ» методом перестановки с ключом К=3142.
П |
Р |
И |
Е |
З |
Ж |
А |
Ю |
Д |
Н |
Е |
М |
|
|
|
|
|
|
|
|
|
|
|
|
И |
П |
Е |
Р |
А |
З |
Ю |
Ж |
Е |
Д |
М |
Н |
|
|
|
|
|
|
|
|
|
|
|
|
Для дешифрования шифротекста необходимо символы шифротекста перемещать в позицию, указанную соответствующим им символом ключа слева направо.
2.4. Алгоритм Гамильтона – гиперкуб Гамильтона
Гиперкуб Гамильтона представлен на рисунке ниже.
Рисунок 17.3
Ключ нужно сформировать самостоятельно.
Исходный текст → ВЕРХОВНЫЙ СУД РФ.
Допустим, началом маршрута будет 5. В исходном тексте 16 символов. Они составят один блок. На блок формируем свой ключ. Ключом является набор вершин графа, которые соединены своим маршрутом Гамильтона (движения из начальной вершины ключа в конечную). При построении маршрута Гамильтона никакую вершину нельзя пройти более одного раза и никакую нельзя пропустить.
Сформируем ключ (маршрут) для этого блока:
К = 5,13,14,6,2,1,9,10,12,4,3,11,15,16,8,7
302
Результаты действий по алгоритму шифрования блока исходного текста шифром усложненной перестановки сведем в таблицу.
Структура этой таблицы такова. В первой строке таблицы записаны номера вершин гиперкуба в естественном порядке их следования.
На блок отводится по три строки, которые заполняются так. В первой строке записывают символы блока исходного текста в естественном порядке их следования.
Во вторую строку записывают номера вершин гиперкуба в том порядке, который определен маршрутом Гамильтона (ключом) для этого блока. Содержимое третьей строки формируется из символов первой строки так: число в данной ячейке второй строки определяет номер того символа из первой строки, который будет записан в ячейку третьей строки под этим же номером. Так в третьей строке формируется блок зашифрованного текста.
Полученные три блока зашифрованного текста объединяем в одну криптограмму:
ОДЭВЕВЙЭУХРСРФЫН
Расшифруем полученную криптограмму. Создаем таблицу и заполняем ее следующим образом. В третью строку записываем символы блока зашифрованного текста в том порядке, как они следуют в криптограмме. Во вторую строку заносим номера вершин гиперкуба, заданные ключом для данного блока. Первую строку заполняем так. В третьей строке отыскиваем символ, у которого номер 1 во второй строке, и записываем его в ячейку номер 1 первой строки (у нас это символ Э).
Аналогично заполняем ячейку номер 2 первой строки (символ К) и все остальные ее ячейки. В результате в первой строке получаем текущий блок расшифрованного текста.
Полученные блоки расшифрованного текста объединяем в один исходный текст:
ВЕРХОВНЫЙ СУД РФ
303
2.5. Шифры многоалфавитной замены. Шифр Гронсфельда.
Представляет собой модификацию шифра Цезаря. Относится к шифрам сложной
(многоалфавитной) замены. В шифрах сложной замены для шифрования каждого символа исходного текста применяется свой шифр простой (моноалфавитной) замены.
Используемые алфавиты применяются циклически и последовательно.
Например, пусть у нас имеется некоторое сообщение 1, 2, 3, … , , … , 2 , …,
которое надо зашифровать. При использовании полиалфавитного шифра имеется несколько моноалфавитных шифров (например, n штук). И в нашем случае к первой букве применяется первый моноалфавитный шифр, ко второй букве — второй, к
третьей — третий, к n-ой букве — n-й, а к n+1 опять первый, ну и так далее.
Теперь конкретно о шифре Гронсфельда. Для шифрования здесь используется числовой ключ. Но каждая буква смещается не на постоянное число позиций, а на то число, которое соответствует ключу. Ключ соответственно состоит не из одной цифры,
а из группы цифр. Ключ не обязательно должен быть таким же длинным как шифруемое сообщение. Если ключ короче сообщения, то его просто повторяют по циклу. Так,
например, если в тексте 10 символов, а длина ключа 5 символов, то для шифрования ключ будет использоваться 2 раза.
Пример:
Исходный текст: «шифр гронсфельда»
Ключ 15382
Зашифрованный текст: «щнчш есуръцёрялв»
2.6. Шифр Вижинера.
Шифр Виженера это метод шифрования буквенного текста с использованием ключевого слова.
Этот метод является простой формой многоалфавитной замены. Шифр Виженера изобретался многократно. Впервые этот метод описал Джованни-Баттиста Беллазо
(Giovan Battista Bellaso) в книге La cifra del. Sig. Giovan Battista Bellasо в 1553 году,
однако в 19 веке получил имя Блеза Виженера, швейцарского дипломата. Метод прост для понимания и реализации, он является недоступным для простых методов криптоанализа.
304
Его принцип состоит в том, что каждая буква в исходном шифруемом тексте сдвигается по алфавиту не на фиксированное, а переменное количество символов.
Величина сдвига каждой буквы задается ключом (паролем) - секретным словом или фразой, которая используется для шифрования и расшифровки.
Допустим, мы хотим зашифровать фразу "КЛАД ЗАРЫТ В САДУ" используя слово ЗИМА в качестве ключа. Запишем это слово подряд несколько раз под исходной фразой:
Рисунок 17.4 – Шифруемый текст и ключ
Для удобства шифрования используем так называемый "квадрат Виженера" –
таблицу, где в каждой строке алфавит сдвигается на одну позицию вправо. Квадрат Вижинера представлен на рисунке 17.5.
Рисунок 17.5 – Квадрат Вижинера
Если взять строку с первой буквой ключа (З) и столбец с первой буквой исходного текста (К), то на их пересечении увидим букву "Т" - это и будет первая буква нашего зашифрованного сообщения. Затем процедура повторяется для всех остальных пар букв
305
ключа и исходного сообщения по очереди и в результате мы получаем зашифрованный вариант нашей исходной фразы:
Рисунок 17.6 – Результат шифрования
Заметьте, что одна и та же буква (например, А) в исходном сообщений превратилась в разные буквы на выходе (Н, Й и Б), т.к. сдвиг при шифровании для них был разный. Именно поэтому вскрыть шифр Виженера простыми способами невозможно - вплоть до 19 века он считался не взламываемым и успешно использовался военными, дипломатами и шпионами многих стран, частности - конфедератами во время Гражданской войны в США.
Дешифрование производится следующим образом: находим в таблице Виженера строку, соответствующую первому символу ключевого слова; в данной строке находим первый символ зашифрованного текста. Столбец, в котором находится данный символ,
соответствует первому символу исходного текста. Следующие символы зашифрованного текста расшифровываются подобным образом.
Если — количество букв в алфавите, — буквы открытого текста, — буквы ключа, то шифрование Виженера можно записать следующим образом:
= ( + )
И расшифровывание:
= ( + − )
В компьютере такая операция соответствует сложению кодов ASCII символов сообщения и ключа по некоторому модулю.
2.7. Шифр Атбаша
Шифр простой замены, использованный для еврейского алфавита и получивший оттуда свое название. Шифрование происходит заменой первой буквы алфавита на последнюю, второй на предпоследнюю. Шифр Атбаш для английского алфавита:
Исходный алфавит: 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
Алфавит замены: Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
306
3. Реализация модуля шифрования и дешифрования методом Цезаря
Опишем ход разработки программного модуля шифрования и дешифрования методом Цезаря. Интерфейс модуля реализуем, используя веб-технологии (язык гипертекстовой разметки HTML и язык описания внешнего стиля документа CSS).
Внешний вид веб-страницы модуля представлен на рисунке 17.7.
Рисунок 17.7 – Интерфейс веб-страницы с модулем шифрования
На рисунке 17.8 представлено окно с основными функциональными возможностями приложения.
Рисунок 17.8 – Окно шифрования/дешифрования
В данном окне располагается генерируемый ключ, текст, зашифрованный методом Цезаря, текстовое поле, куда пользователю предлагается ввести дешифрованный текст, кнопка Проверить, после нажатия на которую в правом верхнем углу появляется сообщение с уведомлением о правильности/неправильности введенного дешифрованного сообщения. Ключ и шифр обновляются при обновлении страницы.
Код верстки страницы представлен в листинге 17.3.
307
Листинг 17.3 – Разметка веб-страницы модуля шифрования
1 |
<!DOCTYPE html> |
|
|
|
|
|
|
2 |
<html lang="en"> |
|
|
|
|
|
|
3 |
<head> |
|
|
|
|
|
|
4 |
<meta charset="UTF-8"> |
|
|
|
|
||
5 |
<title>Взлом шифра!</title> |
|
|
|
|
||
6 |
<script src="script.js"></script> |
|
|
||||
7 |
<link |
href="css/style.css" |
rel="stylesheet" |
||||
type="text/css"/> |
|
|
|
|
|
||
|
|
|
|
|
|
||
8 |
</head> |
|
|
|
|
|
|
9 |
<body onload="scrambler();"> |
|
|
|
|
||
10 |
<div class="header" id="myHeader"></div> |
|
|
||||
11 |
<div id="title" class="labels">Шифр Цезаря</div> |
||||||
12 |
<div id="container"> |
|
|
|
|
||
13 |
<div |
class="labels">Ключ: |
<div |
|
id="key" |
||
class="data_area"></div></div> |
|
|
|
|
|||
14 |
<div |
class="labels">Шифр: |
<div |
id="cipher" |
|||
class="data_area"></div></div> |
|
|
|
|
|||
|
<div class="labels">Дешифровка: <input type="text" |
||||||
15 |
name="decrypt" id="input_decryption" placeholder="Введите |
||||||
|
дешифрованный текст..."></div> |
|
|
|
|
||
16 |
<div id="res"></div> |
|
|
|
|
||
17 |
<div id="div_button_accept_decryption"> |
|
|
||||
|
<button |
|
|
|
name="decrypt_accept" |
||
18 |
class="button_accept_decryption" |
|
|
|
|
||
|
onclick="correctDecipherment();">Проверить</button></div> |
||||||
19 |
</div> |
|
|
|
|
|
|
20 |
<footer><b>© |
Автор |
программы |
- |
Заид |
||
Мингалиев</b></footer> |
|
|
|
|
|
||
21 |
</body> |
|
|
|
|
|
|
22 |
</html> |
|
|
|
|
|
|
Код программы, реализованный в файле script.js, представлен в листинге 17.4.
308
Листинг 17.4 – Модуль программы шифрования
|
var words = ["яблоко", "цыпленок", "корабль", "пират", |
Создается массив строк words, который |
|
|
проинициализирован набором слов. Из этого |
||
1 |
"кот", "молодец", "брат", "акробат", "чуваш", |
||
массива случайным образом будет выбираться |
|||
|
"татарин", "космонавт"]; |
||
|
слово и использоваться для шифрования. |
||
|
|
||
2 |
var alfa = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; |
Создается массив символов alfa, где |
|
содержаться все буквы русского алфавита. |
|||
|
|
||
3 |
var word = ""; |
Переменная, в которой будет хранится |
|
случайное слово, выбранное из массива words. |
|||
|
|
||
|
|
Функция генерации случайного значения, в |
|
|
|
которую передается нижний предел |
|
4 |
function randomInteger(min, max) { |
возвращаемого случайного значение min и |
|
|
|
верхний предел возвращаемого случайного |
|
|
|
значения max. |
|
5 |
var rand = min - 0.5 + Math.random() * (max - min + 1); |
|
|
6 |
return Math.round(rand); |
|
|
7 |
} |
|
|
8 |
function scrambler() |
Функция шифрования исходного текста. |
|
9 |
{ |
|
|
|
|
Создается переменная keyValue, являющаяся |
|
|
|
ключом шифрования, и присваивается ей |
|
10 |
var keyValue = randomInteger(1,10); |
значение, которое возвращает функция |
|
|
|
randomInteger (т.е. генерируется случайное |
|
|
|
значение в диапазоне от 1 до 10). |
|
11 |
var cipherString = ""; |
Создается переменная, в которую будет |
|
записываться зашифрованный текст. |
|||
|
|
||
12 |
word = String(words[randomInteger(0, words.length - |
Выбирается случайное слово из массива words |
|
1)]); |
и преобразуется в тип данных String. |
309
|
|
words.length возвращает количество |
|
|
|
элементов в массиве words. |
|
13 |
for (var j = 0; j < word.length; j++) |
Объявляется цикл для обработки исходного |
|
текста. |
|||
|
|
||
14 |
{ |
|
|
15 |
for(var k = 0; k < alfa.length; k++) |
Цикл для поиска индекса символа входной |
|
строки в алфавите. |
|||
|
|
||
16 |
{ |
|
|
17 |
if(word[j]==alfa[k]) |
Если j–й символ входной строки совпадает с k– |
|
м символом алфавита. |
|||
|
|
||
18 |
{ |
|
|
|
|
Проверяем, не превосходит ли сумма ключа |
|
19 |
if((k + keyValue) <= alfa.length) |
keyValue и индекса k (порядкового номера |
|
|
|
буквы в алфавите) размерности алфавита. |
|
20 |
{ |
Если не превосходит, то … |
|
21 |
cipherString += alfa[k + keyValue]; |
В строку cipherString добавляем (k + |
|
keyValue)–й символ алфавита. |
|||
|
|
||
22 |
} |
|
|
23 |
else if ((k + keyValue) > alfa.length) |
Если превосходит то, … |
|
24 |
{ |
|
|
|
|
В строку cipherString добавляем (k + |
|
25 |
cipherString += alfa[k + keyValue - alfa.length]; |
keyValue - alfa.length)–й символ |
|
|
|
алфавита. |
|
26 |
}}}} |
|
|
|
|
С помощью метода insertAdjacentHTML |
|
|
key.insertAdjacentHTML("afterbegin", `<div |
добавляем в DOM дерево документа с id=key |
|
27 |
строку, указанную в качестве второго параметра |
||
class="keyValue">${keyValue}</div>`); |
|||
|
|
метода. Строка будет проанализирована и |
|
|
|
обработана как HTML. Первый параметр – это |
310