Добавил:
t.me Инфо для ГУАП студентов от меня: https://kafaka.notion.site/99e6d9b70ca74f7baef3daea17839e5a Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Z9411_Чурилов_ИБ_ЛР1

.docx
Скачиваний:
0
Добавлен:
10.11.2024
Размер:
1.44 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

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

«САНКТ-ПЕТЕРБУРГСКИЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА № 33

ЛАБОРАТОРНАЯ РАБОТА

ЗАЩИЩЕНА С ОЦЕНКОЙ

РУКОВОДИТЕЛЬ

доцент

А. В. Окатов

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЁТ О ЛАБОРАТОРНОЙ РАБОТЕ №1

Шифр одноалфавитной замены

по курсу: Информационная безопасность

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

Z9411

А. С. Чурилов

подпись, дата

инициалы, фамилия

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

2024

Цель работы:

Шифрование и дешифрование текста длиной 1000 символов на русском языке.

Порядок выполнения работы:

  1. Выберем произвольный текст для шифрования (рисунок 1)

Рисунок 1. Текст для шифрования

  1. Приведём текст в вид в соответствии с заданием: переведём его в верхний регистр; буквы Ё, Й, Ъ заменим на Е, И, Ь; в тексте оставим только буквы без пробелов. Программный код приведён на рисунке 2, результат работы приведён на рисунке 3.

Рисунок 2. Функция для приведения текста в норму в соответствии с заданием

Рисунок 3. Результат выполнения кода

  1. Выберем алфавит шифрования (шифр Цезаря), зашифруем с помощью него весь текст и переведём на нижний регистр (рисунки 4-8).

Рисунок 4. Функция для шифра алфавита с помощью шифра Цезаря

Рисунок 5. Функция для шифрования текста с помощью шифра Цезаря

Рисунок 6. Исходные данные для шифрования

Рисунок 6. Исполнения программного кода с шифрованием

Рисунок 7. Результат выполнения кода

  1. Проверим правильность шифрования сообщения, расшифровав его с помощью известного нам шифра Цезаря (рисунки 8-10).

Рисунок 8. Функция для дешифровки текста с помощью шифра Цезаря

Рисунок 9. Исполнения программного кода с дешифровкой

Рисунок 10. Результат выполнения кода

  1. Обменяемся с одногруппником зашифрованными сообщениями, без передачи секретного ключа (рисунок 11)

Рисунок 11. Зашифрованный текст одногруппника

  1. Попробуем расшифровать сообщение одногруппника с помощи осреднённой статистики повторяемости букв. (рисунки 12-14)

Рисунок 12. Функция для дешифровки текста при помощи данных по повторяемости букв в русском языке

Рисунок 13. Частота повторяемости букв в русском языке

Рисунок 14. Исполнения программного кода с дешифровкой текста одногруппника

  1. Запустим программный код и попытаемся расшифровать текст одногруппника

Сначала программа подставит буквы по их частоте повторяемости, выведет результат и спросит «расшифрован ли текст» (рисунок 15)

Рисунок 15. Изначальный вариант дешифровки

Выведем текст в блокнот, для наглядности (рисунок 16)

Рисунок 16. Изначальный вариант дешифровки в блокноте

Путём просмотра текста мной было выделено слово «ОТОБЕССО» (рисунок 17), исходя из того, что буква «о» была изначально расшифрована правильно, я решил взять за правду, что это слово «особенно». Нашёл совпадающие буквы в зашифрованном сообщении и поменял их с помощью программы (рисунок 18).

Рисунок 17. Выбранное слово

Рисунок 18. Замена букв в словаре

Выведем обновлённый текст в блокнот (рисунок 19)

Рисунок 19. Обновлённый текст

По той же схеме было выделено слово «САПОП», что я решил принять за «самом» (рисунки 20, 21)

Рисунок 20. Выделенное слово

Рисунок 21. Замена буквы в словаре

Подобным образом постепенно менял буквы на подходящие. Примеры замен букв приведены на рисунках 22-24

Рисунок 22. Замена букв в словаре

Рисунок 23. Замена букв в словаре

Рисунок 24. Замена букв в словаре

В конце, после получения полного логического текста, при выборе расшифрована ли программа пишем «y», программа заканчивает свою работу и выводит расшифрованный текст и словарь с шифром в виде {зашифрованная буква – расшифрованная буква} (рисунок 25)

Рисунок 25. Итоговый результат

Для удобства чтения, результат вынес в блокнот (рисунок 26)

Рисунок 26. Итоговый результат в блокноте

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

Приложение А. Код программы:

def caesar_encoding(letters, step): """ Шифрование алфавита с использованием шифра Цезаря :param letters: Буквы используемого алфавита в виде списка :param step: Шаг смещения у шифра Цезаря :return: Словарь (исходное значение: зашифрованное значение) """ values = letters[step:] + letters[:step] values = [value.lower() for value in values] encoded = {} for i in range(len(letters)): encoded[letters[i]] = values[i] return encoded def encoding(text, cipher): """ Шифрование текста :param text: Текст для шифрования в виде строки :param cipher: Словарь с шифром (исходное значение: зашифрованное значение) :return: Зашифрованный текст в виде строки """ encoded_text = '' for letter in text: encoded_text += cipher[letter] return encoded_text def caesar_decoding(encoded_text, letters, step): """ Расшифрование текста с использованием шифра Цезаря :param encoded_text: Зашифрованный текст в виде строки :param letters: Буквы используемого алфавита в виде списка :param step: Шаг смещения у шифра Цезаря :return: Расшифрованный текст в виде строки """ values = letters[step:] + letters[:step] values = [value.lower() for value in values] decoded = {} for i in range(len(letters)): decoded[values[i]] = letters[i] decoded_text = '' for letter in encoded_text: decoded_text += decoded[letter] return decoded_text def text_convertion(text): """ Подготовка текста к шифрованию :param text: Исходный файл с текстом :return: Готовый текст для шифрования в виде строки """ original_text = text.read() original_text = original_text.upper() final_text = '' for letter in original_text: if letter.isalpha(): if letter == 'Ё': final_text += 'Е' elif letter == 'Й': final_text += 'И' elif letter == 'Ъ': final_text += 'Ь' else: final_text += letter else: continue return final_text def decoding(encoded_text, letters_frequencies): """ Расшифрование текста с использованием шифра Цезаря :param encoded_text: Зашифрованный текст в виде строки :param letters_frequencies: Словарь с частотой букв в тексте (буква: позиция по частоте использования) пример - ('а': 1), где 1 - это буква с самой высокой частотностью, а len(letter_frequencies) с самой низкой """ original_letters = dict(sorted(letters_frequencies.items(), key=lambda i: i[1])) changed_letters = {} for key in letters_frequencies.keys(): changed_letters[key] = 0 for letter in encoded_text: changed_letters[letter] += 1 changed_letters = dict(sorted(changed_letters.items(), key=lambda i: i[1], reverse=True)) final_letters = {} for item in range(len(letters_frequencies)): final_letters[list(changed_letters.keys())[item]] = list(original_letters.keys())[item] decoded = 'n' while decoded == 'n': final_text = '' for letter in encoded_text: final_text += final_letters[letter] print('Получившийся текст:') print(final_text.upper()) print('Исходный текст:') print(encoded_text) cont = input('Введите "n", если сообщение не расшифровано и "y", если расшифровано ').lower() if cont != 'n': break should_continue = 'y' while should_continue == 'y': print('Посмотрите на исходный текст и введите букву, значение которой расшифровано неверно') letter_encoded = input().lower() print('Введите расшифрованную букву') letter_decoded = input().lower() final_letters[letter_encoded] = letter_decoded should_continue = input('Введите "y", если хотите поменять ещё одно значение и "n", если нет ').lower() print('Расшифрованный текст:') print(final_text.upper()) print('Ключ:') print(final_letters) if __name__ == '__main__': # Данные для шифрования letters_str = 'АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯ' # Используемые буквы в виде строки letters = [letter for letter in letters_str] # Используемые буквы в виде списка step = 2 # Шаг для шифра Цезаря # Частота букв в тексте, где 1 - самая частая, 30 - самая редкая letters_frequencies = { 'а': 3, 'б': 21, 'в': 9, 'г': 19, 'д': 13, 'е': 2, 'ж': 24, 'з': 20, 'и': 4, 'к': 11, 'л': 10, 'м': 12, 'н': 5, 'о': 1, 'п': 14, 'р': 8, 'с': 7, 'т': 6, 'у': 15, 'ф': 30, 'х': 23, 'ц': 27, 'ч': 22, 'ш': 25, 'щ': 28, 'ы': 17, 'ь': 18, 'э': 29, 'ю': 26, 'я': 16, } # Открываем файл с текстом и приводим его в норму в соответствии с заданием with open('text.txt', 'r', encoding="UTF-8") as my_file: text = text_convertion(my_file) # Получаем шифр на основе шифра Цезаря и указания шага и алфавита для него cipher = caesar_encoding(letters, step) # Шифруем сообщение encoded_text = encoding(text, cipher) # Проверяем правильную работу дешифратора с известным шифром decoded_own_text = caesar_decoding(encoded_text, letters, step) print(text == decoded_own_text) # Дешифруем текст с неизвестным шифром with open('text_kafka.txt', 'r', encoding="UTF-8") as kafka_file: text_kafka = kafka_file.read() decoding(text_kafka, letters_frequencies)

Выводы:

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

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

Информационная безопасность одно из ключевых направлений в современном мире и данная работа помогает разобраться в её основах.

Соседние файлы в предмете Информационная безопасность