Файл: Лабораторная работа 3 Программная реализация классических алгоритмов шифрования и их криптоанализа Цель.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 03.02.2024

Просмотров: 167

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа №3
Программная реализация классических алгоритмов шифрования и их
криптоанализа
Цель
работы: ознакомление студентов с существующими криптографическими алгоритмами, используемые для защиты информации, формирование умений применять основные криптографические стандарты, протоколы и алгоритмы, формирование навыков прикладной и программной реализации криптоалгоритмов, а также владения криптографической терминологией.
Указания по выполнению лабораторной работы:
1.
Ознакомиться с Теоретическими сведениями о криптографических алгоритмах и стеганографии.
2.
Ознакомиться с примерами реализации криптографических алгоритмов на языке программирования Python.
3.
На основе примеров разработать консольные приложения, реализующие указанные в задании алгоритмы шифрования. Разработанные программы должны иметь следующий функционал: a. Запрос вида криптографического преобразования – шифрование или расшифрование b. Ввод исходного/зашифрованного текста (в зависимости от выбранного вида криптографического преобразования) с помощью консоли либо при чтении из внешнего файла c. Ввод ключа шифрования d. Вычисление шифротекста/открытого текста согласно используемому алгоритму e. Вывод результата на экран либо запись в файл
4. Отчет о лабораторной работе должен содержать: a. Листинги разработанных программ с комментариями b. Скриншоты, иллюстрирующие работу программ как при шифровании, так и при расшифровании c. Ответы на контрольные вопросы
Теоретические сведения
Криптография представляет собой совокупность методов преобразования данных, направленных на то, чтобы сделать эти данные бесполезными для злоумышленника. Такие преобразования позволяют решить два главных вопроса, касающихся безопасности информации:
 защиту конфиденциальности;
 защиту целостности.

Проблемы защиты конфиденциальности и целостности информации тесно связаны между собой, поэтому методы решения одной из них часто применимы для решения другой.
Методы криптографического преобразования информации
(по виду воздействия на исходную информацию)
Сжатие информации может быть отнесено к методам криптографического преобразования информации с определенными оговорками. Целью сжатия является сокращение объема информации. В то же время сжатая информация не может быть прочитана или использована без обратного преобразования.
Учитывая доступность средств сжатия и обратного преобразования, эти методы нельзя рассматривать как надежные средства криптографического преобразования информации. Даже если держать в секрете алгоритмы, то они могут быть сравнительно легко раскрыты статистическими методами обработки.
Поэтому сжатые файлы конфиденциальной информации подвергаются последующему шифрованию. Для сокращения времени передачи данных целесообразно совмещать процесс сжатия и шифрования информации.
Содержанием процесса кодирования информации является замена исходного смысла сообщения (слов, предложений) кодами. В качестве кодов могут использоваться сочетания букв, цифр, знаков.
При кодировании и обратном преобразовании используются специальные таблицы или словари. В информационных сетях кодирование исходного сообщения (или сигнала) программно-аппаратными средствами применяется для повышения достоверности передаваемой информации.
Часто кодирование и шифрование ошибочно принимают за одно и тоже, забыв о том, что для восстановления закодированного сообщения, достаточно знать правило замены, в то время как для расшифровки сообщения помимо знания правил шифрования, требуется ключ к шифру.
Методы стеганографии позволяют скрыть не только смысл хранящейся или передаваемой информации, но и сам факт хранения или передачи закрытой информации.
В основе всех методов стеганографии лежит маскирование закрытой информации среди открытых файлов.
Шифрование
Стеганография
Кодирование
Сжатие


Скрытый файл также может быть зашифрован. Если кто-то случайно обнаружит скрытый файл, то зашифрованная информация будет воспринята как сбой в работе системы.
Комплексное использование стеганографии и шифрования многократно повышает сложность решения задачи обнаружения и раскрытия конфиденциальной информации.
Процесс шифрования заключается в проведении обратимых математических, логических, комбинаторных и других преобразований исходной информации, в результате которых зашифрованная информация представляет собой хаотический набор букв, цифр, других символов и двоичных кодов.
Для шифрования информации используются алгоритм преобразования и ключ.
Исходными данными для алгоритма шифрования служит информация, подлежащая зашифрованию, и ключ шифрования.
Ключ содержит управляющую информацию, которая определяет выбор преобразования на определенных шагах алгоритма и величины операндов, используемых при реализации алгоритма шифрования.
Шифрование является основным видом криптографического преобразования информации в компьютерных сетях.
Процесс преобразования открытой информации в закрытую получил название зашифрование, а процесс преобразования закрытой информации в открытую
– расшифрование.
Атака на шифр (криптоанализ, криптоатака) – это процесс расшифрования закрытой информации без знания ключа и, возможно, при отсутствии сведений об алгоритме шифрования.
Современные методы шифрования должны отвечать следующим требованиям:
• стойкость шифра противостоять криптоанализу (криптостойкость) должна быть такой, чтобы вскрытие его могло быть осуществлено только путем решения задачи полного перебора ключей;
• криптостойкость обеспечивается не секретностью алгоритма шифрования, а секретностью ключа;
• шифртекст не должен существенно превосходить по объему исходную информацию;
• ошибки, возникающие при шифровании, не должны приводить к искажениям и потерям информации;
• время шифрования не должно быть большим;
• стоимость шифрования должна быть согласована со стоимостью закрываемой информации.
Преобразование шифрования может быть симметричным и асимметричным относительно преобразования расшифрования.

Это важное свойство определяет два класса криптосистем:
 симметричные (одноключевые) криптосистемы;
 асимметричные
(двухключевые) криптосистемы
(с открытым ключом).
Симметричное шифрование, которое часто называют шифрованием с помощью секретных ключей, в основном используется для обеспечения конфиденциальности данных.
Для этого пользователи должны совместно выбрать единый математический алгоритм, который будет использоваться для шифрования и расшифровки данных. Кроме того, им нужно выбрать общий (секретный) ключ, который будет использоваться с принятым ими алгоритмом зашифрования и расшифрования.
С методом симметричного шифрования связаны следующие проблемы:
 необходимо часто менять секретные ключи, поскольку всегда существует риск их случайного раскрытия (компрометации);
 достаточно сложно обеспечить безопасность секретных ключей при их генерировании, распространении и хранении.
Классификация симметричных криптоалгоритмов
Симметричные криптоалгоритмы
Поточные
Блочные
Перестановочные
Подстановочные
Моноалфавитные
Полиалфавитные


Предварительное задание для выполнения лабораторной работы
1. Изучить принцип действия классических методов шифрования: a. Шифр Цезаря b. Шифр перестановки c. Метод гаммирования d. Шифр Виженера e. Шифр Полибия f. Шифр Плейфера g. Аффинный шифр
2. Установить среду разработки для программирования на языке Python версии 3.7 и выше https://www.python.org/downloads/windows/
Пример
реализации
криптографических
алгоритмов
на
языке
программирования Python.
В качестве примера программной исполнения криптографических алгоритмов рассмотрим реализацию в двух вариантах шифра Цезаря на языке программирования Python.
Программная реализация шифра Цезаря (вариант 1)
Для составления программы, исполняющей криптографические преобразования с текстом, напомним принцип действия шифра Цезаря.
Шифр Цезаря является классическим примером шифра подстановки (замены).
Он задается подстановкой следующего вида (применительно к русскому алфавиту):
Верхний алфавит – это алфавит отрытого (исходного) текста. Нижний алфавит, представляющий собой циклический сдвиг верхнего алфавита влево на 3 шага, есть алфавит шифрованного текста. Буква А открытого текста
заменяется на букву Г в шифрованном, буква Б - на букву Д и т.д. В наши дни под шифром Цезаря понимаются все шифры, в которых нижняя строка является циклическим сдвигом верхней на произвольное число шагов. Но поскольку этот сдвиг не меняется в процессе шифрования, то шифр остается шифром простой (одноалфавитной) замены.
Для того, чтобы текст программы разработанного приложения в дальнейшем было удобно читать, редактировать и совершенствовать, мы будем применять модульный подход. Разрабатываемое нами консольное приложение будет состоять из следующих модулей:
- основной модуль
main.py
- вспомогательный модуль с описанием функций шифрования и расшифрования
functions.py
Файлы данных модулей необходимо поместить в заранее созданную папку
lab_rabota.
В основном модуле будут осуществляться следующие действия:
- определение алфавита, из букв которого будут состоять исходные и зашифрованные тексты
- ввод ключа шифрования
- выбор пользователем вида криптографического преобразования
- ввод исходного/зашифрованного текста в зависимости от выбранного вида преобразования (если выбрано шифрование, то пользователю нужно будет ввести исходный текст, в противном случае пользователь введет зашифрованный текст)
- вызов функции шифрования или расшифрования, в зависимости от выбора пользователя.
Модуль с функциями будет содержать описание функций шифрования и расшифрования. Очевидно, что данные функции будут иметь сходную структуру и выполнять обратные друг другу криптографические преобразования. В рамках выполнения каждой из функций, приложение будет запрашивать у пользователя исходный/зашифрованный текст, выполнять шифрование/расшифрование и выводить результат на экран.
Начнем разработку приложения с написания модуля
main.py. Для того, чтобы внутри него использовать функции модуля
functions.py, необходимо их импортировать. Для этого напишем: from functions import encryption, decryption
Как было указано выше, для шифрования и расшифрования необходимо осуществлять циклический сдвиг алфавита на определенное количество символов. В базовом варианте программной реализации шифра Цезаря будем

использовать только русский алфавит, поэтому первую строчку в нашей программе запишем следующим образом: alpha = 'абвгдеёжзийклмнопрстуфхцчшщьыъэюя'
Записав в переменную
alpha строку, состоящую из последовательности букв английского алфавита, мы далее можем производить сдвиг на количество символов, указанных пользователем в качестве ключа шифрования.
Для ввода в консоль ключа шифрования
Key используем команду
input(). Но нужно иметь в виду, что, если даже пользователь введет число, тип введенных данных будет строковым . А для шифра Цезаря ключом шифрования является количество букв для циклического сдвига, то есть только целое число. Поэтому мы дополнительно применяем функцию
int(), которая преобразует строку в целое число. Кроме того, функция
int() «не пропустит» дальше и дробные числа (отбросит дробную часть).
Key = int(input("Enter key: "))
Следующее действие по плану – выбор вида криптографического преобразования, то есть мы должны спросить пользователя, что он намерен сделать – зашифровать или расшифровать текст. Для этого пользователь вводит букву, соответствующую необходимому виду преобразования: operation = input("Введите 'ш' для шифрования, 'р' для расшифрования: ")
Теперь используя оператор условного перехода в зависимости от введенной буквы попросим пользователя ввести исходный/зашифрованный текст и выведем на экран результат выполнения соответствующей функции: if operation == 'ш':
PlainText = input("Введите текст для шифрования: ").strip()
CipherText = encryption(Key, PlainText, alpha) print("Шифротекст: " + CipherText) elif operation == 'р':
CipherText = input("Введите текст для расшифрования: ").strip()
PlainText = decryption(Key, CipherText, alpha) print("Исходный текст: " + PlainText) else: print("Выбрана неверная операция")
В случае, если пользователь введет неверную букву, будет выведено соответствующее сообщение.

Как вы могли заметить, при вводе пользователем исходного или зашифрованного текста использована дополнительная функция
strip(), которая удаляет лишние пробелы в начале и конце строки.
На этом написание программы основного модуля завершим и приступим к описанию функций шифрования и расшифрования в модуле
functions.py.
Функция шифрования
encryption принимает на вход три обязательных аргумента (ключ шифрования (
Key), исходный текст
(
PlainText), используемый алфавит alpha) и возвращает зашифрованный текст (
CipherText).
Для начала в теле функции
encryption объявим переменную
CipherText, в которую будет записываться зашифрованный текст, и присвоим ей значение, состоящее из пустой строки. def encryption(Key, PlainText, alpha):
CipherText = ''
Далее с помощью цикла будем последовательно зашифровывать каждую букву исходного текста и конкатенировать результат шифрования с переменной
CipherText: for p in
PlainText:
CipherText += alpha[(alpha.index(p) + Key) % len(alpha)]
Поясним, какие операции включает в себя строка, находящаяся в теле цикла:
1) p – очередная буква исходного текста
2) получение индекса (порядкового номера) буквы исходного текста в алфавите с помощью функции
alpha.index(p)
3) сложение полученного индекса со смещением (ключом шифрования) -
alpha.index(p) + key
4)
len(alpha)
– определение мощности алфавита (общее количество букв в алфавите)
5) получение остатка от деления полученного индекса на мощность алфавита
- (alpha.index(p) + key) % len(alpha), так как результат сложения на предыдущем этапе может оказаться больше, чем мощность алфавита
6) получение буквы с вычисленным индексом:
alpha[(alpha.index(p) + key) % len(alpha)]
7) конкатенация полученной буквы с переменной
CipherText:
CipherText += alpha[(alpha.index(p) + Key) % len(alpha)]


После того, как мы получили зашифрованный текст, нам необходимо вывести результат выполнения функции
encryption: return
CipherText
Задание.
По аналогии с описанием функции шифрования, напишите самостоятельно обратную ей функцию - функцию дешифрования
decryption, принимающую на вход три аргумента (ключ шифрования
Key, зашифрованный текст
CipherText
, используемый алфавит
alpha
)
и возвращающей исходный текст
PlainText.
Тестирование программы
Для тестирования разработанной программы запустим командную строку
cmd.exe, зайдем в папку lab_rabota с файлом программы и выполним следующую команду: python main.py
Если программа была написана правильно, то мы должны получить следующий результат:
Задание.
1. Внесите в программу следующие изменения: a. Измените язык используемого алфавита на английский b. Добавьте цифры, знаки препинания.
2. Протестируйте работу программы.

Программная реализация шифра Цезаря (вариант 2)
Очевидно, что предыдущий вариант реализации шифра Цезаря имеет ограниченный функционал и следующие недостатки:
1) Необходимо вручную задавать алфавит, в рамках которого происходит шифрование и расшифрование.
2) Ввод и вывод пользовательской информации происходит только в консоли
Для того, чтобы исправить перечисленные недостатки, добавим возможность шифрования и расшифрования текстов, состоящих из символов без привязки к конкретному алфавиту и регистру, а также учитывающая наличие других специальных символов. В качестве алфавита здесь будет выступать таблица кодов символов ASCII.
Таблица ASCII определяет коды для символов:
 десятичных цифр;
 латинского алфавита;
 национального алфавита (в нашем случае русского)
 знаков препинания;
 управляющих символов.
Модификация предыдущей программы коснется главным образом модуля
functions.py, основной модуль будет изменен незначительно. Создадим копию модуля
functions.py и сохраним его под именем functions_v2.py.
Так как вместо задаваемого вручную алфавита мы будем использовать таблицу кодов ASCII, то надобность в третьем аргументе
alpha для функций
encryption() и decryption () исчезает.
Для того, чтобы получить код какого-либо символа из таблицы ASCII, необходимо в нужную переменную записать результат выполнения функции
ord(letter), где letter – это символ. Обратное преобразование – получение символа из кода – происходит с помощью функции
chr(code), где
code – это код искомого символа.
По аналогии с предыдущим вариантом шифрование будет происходить путем сложения индекса очередного символа шифруемого сообщения со смещением
Key: def encryption(Key, PlainText):
CipherText = '' for p in
PlainText:
code = ord(p)+Key
CipherText += chr(code)