Найти тему
Spark. Блог обо всем!

Криптография. Шифр простой замены.

Оглавление

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

Приготовьте свои клавиатуры и пальчики!

Терминология

Шифр = криптосистема
Закрытый текст = зашифрованный текст

Икзкабт, сюьзъ! Лмескае ю ижэ е нжьге уок мьдяьаьз езе мьдяьаьзь жка ед пмкжь е лкзпуе уьн юмбибйе ю лкаьмкж!

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

y = (x + k) mod n
y - номер символа в алфавите
x - номер исходного символа в алфавите
k - шаг изменения номера буквы
n - длина алфавита
mod - остаток от деления (12 mod 10 = 2)

А это шифр — система, которая указывает, как будут меняться буквы, насколько переставляться и т.д.

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

Атака, взлом, вскрытие попытка узнать исходный текст сообщения без ключа.

Дешифровка — взлом или расшифровка самая обычная и законная.

-2

Шифр простой замены

Шифр простой замены — класс методов шифрования, которые сводятся к созданию таблицы шифрования, в которой для каждой буквы открытого текста существует единственная сопоставленная ей буква шифр-текста. Само шифрование заключается в замене букв согласно таблице. Для расшифровки достаточно иметь ту же таблицу, либо знать алгоритм, по которому она генерируется.

-3

Что-то напоминает, не так ли?
Правильно, очень похоже на шифр Цезаря, который является частным случаем шифра простой замены.

Реализация в Python

Цели:

  1. Научиться использовать словари.

Что такое словари?

-4

Словари - это неотсортированные базы данных, доступ к которым происходит по ключу.

Для работы со словарем, его необходимо сначала создать. Есть несколько способов:

  • С помощью литерала:
    >>> 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)}

Создаем списки и словарь, используя генератор списков.

-5

Ваш код готов! Зашифровка сообщения проходит успешно, но как его расшифровать? Узнаете в следующей статье.

НЕ бойтесь узнавать новое и экспериментировать!
На связи колонка про шифры, увидимся через неделю.

#криптография #шифры и коды #шифры #коды #программирование #безопасность