В предыдущей статье мы рассказали основную терминологию криптографии, а также разобрали один из популярных шифров - шифр Цезаря. В этой статье мы подробнее расскажем о шифре простой замены, который легко запрограммировать.
Приготовьте свои клавиатуры и пальчики!
Терминология
Шифр = криптосистема
Закрытый текст = зашифрованный текст
Икзкабт, сюьзъ! Лмескае ю ижэ е нжьге уок мьдяьаьз езе мьдяьаьзь жка ед пмкжь е лкзпуе уьн юмбибйе ю лкаьмкж!
Перед вами зашифрованный текст - то, что получилось из исходного после шифрования.
y = (x + k) mod n
y - номер символа в алфавите
x - номер исходного символа в алфавите
k - шаг изменения номера буквы
n - длина алфавита
mod - остаток от деления (12 mod 10 = 2)
А это шифр — система, которая указывает, как будут меняться буквы, насколько переставляться и т.д.
Криптоаналитик — человек, который пытается вскрыть зашифрованное сообщение, которое не ему предназначено.
Атака, взлом, вскрытие — попытка узнать исходный текст сообщения без ключа.
Дешифровка — взлом или расшифровка самая обычная и законная.
Шифр простой замены
Шифр простой замены — класс методов шифрования, которые сводятся к созданию таблицы шифрования, в которой для каждой буквы открытого текста существует единственная сопоставленная ей буква шифр-текста. Само шифрование заключается в замене букв согласно таблице. Для расшифровки достаточно иметь ту же таблицу, либо знать алгоритм, по которому она генерируется.
Что-то напоминает, не так ли?
Правильно, очень похоже на шифр Цезаря, который является частным случаем шифра простой замены.
Реализация в Python
Цели:
- Научиться использовать словари.
Что такое словари?
Словари - это неотсортированные базы данных, доступ к которым происходит по ключу.
Для работы со словарем, его необходимо сначала создать. Есть несколько способов:
- С помощью литерала:
>>> d = {} >>> d {}
>>> d = {'dict': 1, 'dictionary': 2} - С помощью функции dict:
>>> d = dict(short='dict', long='dictionary') >>> d {'short': 'dict', 'long': 'dictionary'}
>>> d = dict([(1, 1), (2, 4)]) - С помощью метода fromkeys:
>>> d = dict.fromkeys(['a', 'b']) >>> d {'a': None, 'b': None}
>>> d = dict.fromkeys(['a', 'b'], 100) - С помощью генераторов словарей, которые очень похожи на генераторы списков:
>>> d = {a: a ** 2 for a in range(7)}
Рассмотрим код полностью
import random # импортируем модуль рандома
X = int(input("Введите ключ(число)"))
random.seed(X) # начинаем генерацию случайных значений
random_list = list(range(1072,1104)) # создаем список с номерами русских символов
random.shuffle(random_list) # перемешиваем его
closed_alphabet = [chr(i) for i in random_list] # на основе перемешанного списка создаем алфавит
open_alphabet = [chr(i) for i in range(1072,1104)] # обычный алфавит
slovar = {open_alphabet[i]:closed_alphabet[i] for i in range(32)} # совмещаем 2 списка в 1 словарь
open_text =input("Введите сообщение")
closed_text = ""
for char in open_text: # для каждого символа в тексте
closed_text+=slovar[char] # находим пару для символа и составляем слово
print(closed_text)
Выглядит сложно и запутанно, но только выглядит, давайте разберем по порядку.
random.seed(X) # начинаем генерацию случайных значений
Дело в том, что компьютер не может сгенерировать случайные значения, только псевдослучайные, этим и воспользуемся, управляя генератором с помощью ключа.
random_list = list(range(1072,1104)) # создаем список с номерами русских символов
random.shuffle(random_list) # перемешиваем его
Огромную цепочку из скобок применить не получится. Потому что random.shuffle принимает только списки и изменяет их, не возвращая ничего. То, что выдает range, не является списком, но превращается в него.
closed_alphabet = [chr(i) for i in random_list]
open_alphabet = [chr(i) for i in range(1072,1104)]
slovar = {open_alphabet[i]:closed_alphabet[i] for i in range(32)}
Создаем списки и словарь, используя генератор списков.
Ваш код готов! Зашифровка сообщения проходит успешно, но как его расшифровать? Узнаете в следующей статье.
НЕ бойтесь узнавать новое и экспериментировать!
На связи колонка про шифры, увидимся через неделю.
#криптография #шифры и коды #шифры #коды #программирование #безопасность