Шифр цезаря на python (руководство по шифрованию текста)

Шифрование цифр и знаков препинания

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

Как насчет цифр, как насчет специальных символов и знаков препинания?

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

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

Итак, мы попытаемся закодировать заглавные и строчные символы так, как мы это делали в предыдущем разделе, игнорируя пока пунктуацию, а затем мы также закодируем цифры в тексте.

Для чисел мы можем выполнить кодирование одним из двух способов:

  • Сдвинуть значение цифр на столько же, на сколько сдвинуты буквы алфавита, то есть при сдвиге на 3 – цифра 5 становится 8, 2 – 5, 9 – 2 и так далее.
  • Сделать цифры частью алфавита, т.е. за z или Z будут следовать 0,1,2. до 9, и на этот раз наш делитель для выполнения модуля будет 36, а не 26.

Мы реализуем наше решение, используя первую стратегию. Кроме того, на этот раз мы реализуем наше решение в виде функции, принимающей в качестве параметра значение смещения (которое служит ключом в Cesar Encryption).

Мы реализуем 2 функции: cipher_encrypt() и cipher_decrypt().

Немного о проекте

Мне, лично, давно была интересна тема шифрования информации, однако, каждый раз погрузившись в эту тему, я осознавал насколько это сложно и понял, что лучше начать с чего-то более простого. Я, лично, планирую написать некоторое количество статей на эту тему, в которых я покажу вам различные алгоритмы шифрования и их реализацию в Python, продемонстрирую и разберу свой проект, созданный в этом направлении. Итак, начнем.

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

  • Шифр Цезаря

  • Шифр Виженера

  • Шифр замены

  • Омофонический шифр

  • RSA шифрование

Множественные смещения (шифрование по Виженеру)

До сих пор мы использовали одно значение сдвига (ключ) для сдвига всех символов в строках на одинаковое количество позиций.

Мы также можем попробовать вариант, в котором мы будем использовать не одну клавишу, а последовательность клавиш для выполнения различных сдвигов в разных позициях текста.

Например, допустим, мы используем последовательность из 4 клавиш: 1,5,2,3] При таком методе наш первый символ в тексте сдвинется на одну позицию, второй – на пять позиций,

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

Это улучшенная версия шифра Цезаря, которая называется шифром Виженера.

Давайте применим шифр Виженера на практике.

Функция выполняет как шифрование, так и дешифрование, в зависимости от значения булевого параметра “decrypt”.

Мы отслеживаем общее количество зашифрованных/расшифрованных строчных букв с помощью переменной i, используем ее с оператором modulus, чтобы определить, какой ключ из списка использовать следующим.

Обратите внимание, что мы сделали операцию сдвига очень компактной; это эквивалентно многоэтапному процессу преобразования между Unicode и символьными значениями и вычисления сдвига, который мы видели ранее. Давайте попробуем использовать эту функцию на примере другого простого текста:

Давайте попробуем использовать эту функцию на примере другого простого текста:

Здесь мы выполняем шифрование, используя ключи , и, как и ожидалось, первый символ “w” был сдвинут на одну позицию к “x”,

второй символ “e” сдвинут на две позиции к “g”; третий символ “w” сдвинут на три позиции к “z”.

Этот процесс повторяется со следующими символами.

Выполните процесс расшифровки с теми же ключами и посмотрите, сможете ли вы снова восстановить исходное заявление.

Задания для квеста

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

Большинство заданий сгруппированы в категории.

Большинство заданий также имеют свои уровни сложности. Для изменения сложности выбранного задания используйте соответствующий ползунок.

Некоторые задания имеют дополнительные настройки. Иногда изменение настроек может также повлиять на сложность задания.

Если в поле «Возраст» ввести возраст того, для кого создаётся квест, то задание из категории или уровень сложности задания автоматически будут примерно подбираться под этот возраст (задание не будет слишком сложным или слишком лёгким).

Шифр Цезаря в Python на примере английского алфавита

Прежде чем мы погрузимся в определение функций для процесса шифрования и расшифровки шифра Цезаря в Python, мы сначала рассмотрим две важные функции, которые мы будем использовать в процессе – chr() и ord().

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

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

Каждый из этих символов представлен в памяти компьютера с помощью числа, называемого кодом символов ASCII (или его расширением – Unicode), который представляет собой 8-битное число и кодирует почти все символы, цифры и пунктуацию.

Например, заглавная буква “А” представлена числом 65, “В” – 66 и так далее. Аналогично, представление строчных символов начинается с числа 97.

Когда возникла необходимость включить больше символов и знаков из других языков, 8 бит оказалось недостаточно, поэтому был принят новый стандарт – Unicode, который представляет все используемые в мире символы с помощью 16 бит.

ASCII является подмножеством Unicode, поэтому кодировка символов ASCII остается такой же в Unicode. Это означает, что ‘A’ все равно будет представлено с помощью числа 65 в Юникоде.

Обратите внимание, что специальные символы, такие как пробел ” “, табуляция “\t”, новая строка “\N” и т.д., также представлены в памяти своим Юникодом. Мы рассмотрим две встроенные функции Python, которые используются для поиска представления символа в Unicode и наоборот

Мы рассмотрим две встроенные функции Python, которые используются для поиска представления символа в Unicode и наоборот.

Инструкция для квеста

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

В итоге, всё что вам потребуется сделать — это следовать инструкции. По умолчанию в каждом пункте инструкции указывается её номер (номер каждой подсказки расположен в её левом верхнем углу), название задания и место, куда эту подсказку нужно спрятать.

Вы можете сократить инструкцию, оставив только номер подсказки и место для её прятания. В этом случае не следует удалять номера подсказок.

Решение

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

Обратите внимание, что все, кроме знаков препинания и пробелов, зашифровано. Теперь давайте посмотрим на шифрованный текст, который полковник Ник Фьюри посылал на свой пейджер: “Mr xli gsyrx sj 7, 6, 5 – Ezirkivw Ewwiqfpi!”

Теперь давайте посмотрим на шифрованный текст, который полковник Ник Фьюри посылал на свой пейджер: “Mr xli gsyrx sj 7, 6, 5 – Ezirkivw Ewwiqfpi!”.

Это оказывается шифротекст Цезаря, и, к счастью, ключ к этому шифру у нас в руках.

Давайте посмотрим, сможем ли мы обнаружить скрытое послание.

Отличная работа, Мстители!

Коды и сокращения

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

Коды аэропортов Международной ассоциации воздушного транспорта — это трехбуквенные коды, используемые для обозначения аэропортов и используемые для багажных бирок . Коды станций аналогичным образом используются на железных дорогах, но обычно являются национальными, поэтому один и тот же код может использоваться для разных станций, если они находятся в разных странах.

Иногда кодовое слово приобретает независимое существование (и значение), в то время как исходная эквивалентная фраза забывается или, по крайней мере, больше не имеет точного значения, приписываемого кодовому слову. Например, «30» широко использовалось в журналистике для обозначения «конца истории» и использовалось в других контекстах для обозначения «конца».

Пример работы

Если мы зашифруем так фразу «Привет, это журнал Код!», то можем получить что-то такое:

hi857ов9njg5jоlр6;p0ора

Штука в том, что одна и та же буква в шифровке не означает одинаковые буквы в исходном сообщении, потому что биты шифрования выбраны случайным образом. Поэтому при попытке расшифровки злоумышленник получит такие варианты:

Срочно подпишись на код

Верни деньги, а то вилы

мама, я сдал зачёт, ура

Ваш зам предатель и вор

Ваш зам ни при чём, вот

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

Стеганография

Стеганография старше кодирования и шифрования. Это искусство появилось очень давно. Оно буквально означает «скрытое письмо» или «тайнопись». Хоть стеганография не совсем соответствует определениям кода или шифра, но она предназначена для сокрытия информации от чужих глаз.

Стеганография является простейшим шифром. Типичными ее примерами являются проглоченные записки, покрытые ваксой, или сообщение на бритой голове, которое скрывается под выросшими волосами. Ярчайшим примером стеганографии является способ, описанный во множестве английских (и не только) детективных книг, когда сообщения передаются через газету, где малозаметным образом помечены буквы.

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

2.1 Блочное кодирование

Информация в ПК уже представлена в виде блоков по 8 бит, но мы, зная контекст, попробуем представить её в виде блоков меньшего размера. Для этого нам нужно собрать информацию о представленных символах и, на будущее, сразу подсчитаем частоту использования каждого символа:

Символ

Количество

ПРОБЕЛ

18

Р

12

К

11

Е

11

У

9

А

8

Г

4

В

3

Ч

2

Л

2

И

2

З

2

Д

1

Х

1

С

1

Т

1

Ц

1

Н

1

П

1

Всего нами использовано 19 символов (включая пробел). Для хранения в памяти ПК будет затрачено 18+12+11+11+9+8+4+3+2+2+2+2+1+1+1+1+1+1+1=91 байт (91*8=728 бит).

Эти значения мы берём как константы и пробуем изменить подход к хранению блоков. Для этого мы замечаем, что из 256 кодов для символов мы используем только 19. Чтобы узнать — сколько нужно бит для хранения 19 значений мы должны посчитать LOG2(19)=4.25, так как дробное значение бита мы использовать не можем, то мы должны округлить до 5, что нам даёт максимально 32 разных значения (если бы мы захотели использовать 4 бита, то это дало бы лишь 16 значений и мы не смогли бы закодировать всю строку).

Нетрудно посчитать, что у нас получится 91*5=455 бит, то есть зная контекст и изменив способ хранения мы смогли уменьшить использование памяти ПК на 37.5%.

К сожалению такое представление информации не позволит его однозначно декодировать без хранения информации о символах и новых кодах, а добавление нового словаря увеличит размер данных. Поэтому подобные способы кодирования проявляют себя на бОльших объемах данных.

Кроме того, для хранения 19 значений мы использовали количество бит как для 32 значений, это снижает эффективность кодирования.

Типы

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

Исторический

Исторические ручные и бумажные шифры, использовавшиеся в прошлом, иногда называют классическими шифрами . Они включают простые шифры подстановки (например, ROT13 ) и шифры транспонирования (например, шифр Rail Fence ). Например, «ХОРОШАЯ СОБАКА» может быть зашифрована как «PLLX XLP», где «L» заменяет «O», «P» — «G» и «X» вместо «D» в сообщении. Перестановка букв «ХОРОШАЯ СОБАКА» может привести к «ДГОГДОО». Эти простые шифры и примеры легко взломать даже без пар открытый текст-зашифрованный текст.

Простые шифры были заменены полиалфавитными шифрами подстановки (такими как шифры Виженера ), которые изменили алфавит подстановки для каждой буквы. Например, «GOOD DOG» может быть зашифрован как «PLSX TWF», где «L», «S» и «W» заменяют «O». Даже при небольшом количестве известного или предполагаемого открытого текста простые полиалфавитные шифры замещения и шифры перестановки букв, разработанные для шифрования пером и бумагой, легко взломать. Тем не менее, можно создать надежную ручку и бумажный шифр на основе одноразового блокнота , но при этом одноразовых блокнотов .

В начале двадцатого века были изобретены электромеханические машины для шифрования и дешифрования с использованием транспозиции, полиалфавитной замены и своего рода «аддитивной» замены. В роторных машинах несколько дисков ротора обеспечивали полиалфавитную замену, а вставные платы обеспечивали другую замену. Ключи легко менялись, меняя диски ротора и провода коммутационной панели. Хотя эти методы шифрования были более сложными, чем предыдущие схемы и требовали машин для шифрования и дешифрования, для взлома этих методов были изобретены другие машины, такие как British Bombe .

Современный

Современные методы шифрования можно разделить по двум критериям: по типу используемого ключа и по типу входных данных.

По типу используемого ключа шифры делятся на:

  • алгоритмы с симметричным ключом ( криптография с закрытым ключом ), где один и тот же ключ используется для шифрования и дешифрования, и
  • Алгоритмы с асимметричным ключом ( криптография с открытым ключом ), где для шифрования и дешифрования используются два разных ключа.

В алгоритме с симметричным ключом (например, DES и AES ) отправитель и получатель должны иметь общий ключ, настроенный заранее и хранящийся в секрете от всех других сторон; отправитель использует этот ключ для шифрования, а получатель использует тот же ключ для дешифрования. Шифр Фейстеля использует комбинацию замещения и транспозицию методов. Большинство алгоритмов блочного шифрования основано на этой структуре. В алгоритме с асимметричным ключом (например, RSA ) есть два отдельных ключа: открытый ключ публикуется и позволяет любому отправителю выполнять шифрование, в то время как закрытый ключ хранится получателем в секрете и позволяет только этому человеку выполнить правильное дешифрование.

Шифры можно разделить на два типа по типу входных данных:

  • блочные шифры , которые шифруют блок данных фиксированного размера, и
  • потоковые шифры , которые шифруют непрерывные потоки данных.

2.5.1 Строки и подстроки

До сих пор мы кодировали данные, рассматривая их как совокупность отдельных символов. Сейчас мы попробуем кодировать целыми словами.

Напомню нашу строку: «ЕХАЛ ГРЕКА ЧЕРЕЗ РЕКУ ВИДИТ ГРЕКА В РЕЧКЕ РАК СУНУЛ ГРЕКА РУКУ В РЕКУ РАК ЗА РУКУ ГРЕКУ ЦАП».

Составим таблицу повторов слов:

Слово

Количество

ПРОБЕЛ

18

ГРЕКА

3

В

2

РАК

2

РЕКУ

2

РУКУ

2

ВИДИТ

1

ГРЕКУ

1

ЕХАЛ

1

ЗА

1

РЕЧКЕ

1

СУНУЛ

1

ЦАП

1

ЧЕРЕЗ

1

Для кодирования нам нужно придумать концепцию, например — мы создаём словарь и каждому слову присваиваем индекс, пробелы игнорируем и не кодируем, но считаем, что каждое слово разделяется именно символом пробела.

Сначала формируем словарь:

Слово

Количество

Индекс

ГРЕКА

3

В

2

1

РАК

2

2

РЕКУ

2

3

РУКУ

2

4

ВИДИТ

1

5

ГРЕКУ

1

6

ЕХАЛ

1

7

ЗА

1

8

РЕЧКЕ

1

9

СУНУЛ

1

10

ЦАП

1

11

ЧЕРЕЗ

1

12

Таким образом наша строка кодируется в последовательность:

7, 0, 12, 3, 5, 0, 1, 9, 2, 10, 0, 4, 1, 3, 2, 8, 4, 6, 11

Это подготовительный этап, а вот то, как именно нам кодировать словарь и данные уже после подготовительного кодирования — процесс творческий. Мы пока останемся в рамках уже известных нам способов и начнём с блочного кодирования.

Индексы записываем в виде блоков по 4 бита (так можно представить индексы от 0 до 15), таких цепочек у нас будет две, одна для закодированного сообщения, а вторая для соответствия индексу и слову. Сами слова будем кодировать кодами Хаффмана, только нам еще придется задать разделитель записей в словаре, можно, например, указывать длину слова блоком, самое длинное слово у нас в 5 символов, для этого хватит 3 бита, но так же мы можем использовать код пробела, который состоит из двух бит — так и поступим. В итоге мы получаем схему хранения словаря:

Индекс / биты

Слово / биты

Конец слова / биты

0 / 4

ГРЕКА / 18

ПРОБЕЛ / 2

1 / 4

В / 5

ПРОБЕЛ / 2

2 / 4

РАК / 10

ПРОБЕЛ / 2

3 / 4

РЕКУ / 12

ПРОБЕЛ / 2

4 / 4

РУКУ / 12

ПРОБЕЛ / 2

5 / 4

ВИДИТ / 31

ПРОБЕЛ / 2

6 / 4

ГРЕКУ / 17

ПРОБЕЛ / 2

7 / 4

ЕХАЛ / 20

ПРОБЕЛ / 2

8 / 4

ЗА / 10

ПРОБЕЛ / 2

9 / 4

РЕЧКЕ / 18

ПРОБЕЛ / 2

10 / 4

СУНУЛ / 26

ПРОБЕЛ / 2

11 / 4

ЦАП / 17

ПРОБЕЛ / 2

12 / 4

ЧЕРЕЗ / 21

ПРОБЕЛ / 2

7

12

3

5

1

9

2

10

4

1

3

2

8

4

6

11

и само сообщение по 4 бита на код.

Считаем всё вместе и получаем 371 бит. При этом само сообщение у нас было закодировано в 19*4=76 бит. Но нам всё еще требуется сохранять соответствие кода Хаффмана и символа, как и во всех предыдущих случаях.

1.2 Чередующиеся сигналы

Индеец пингует

В примитивном виде кодирование чередующимися сигналами используется человечеством очень давно. В предыдущем разделе мы сказали про дым и огонь. Если между наблюдателем и источником огня ставить и убирать препятствие, то наблюдателю будет казаться, что он видит чередующиеся сигналы «включено/выключено». Меняя частоту таких включений мы можем выработать последовательность кодов, которая будет однозначно трактоваться принимающей стороной.

Наряду с сигнальными флажками на морских и речных судах, при появлении радио начали использовать код Морзе. И при всей кажущейся бинарности (представление кода двумя значениями), так как используются сигналы точка и тире, на самом деле это тернаный код, так как для разделения отдельных кодов-символов требуется пауза в передаче кода. То есть код Морзе кроме «точка-тире», что нам даёт букву «A» может звучать и так — «точка-пауза-тире» и тогда это уже две буквы «ET».

Создание таблицы поиска

Строковый модуль Python предоставляет простой способ не только создать таблицу поиска, но и перевести любую новую строку на основе этой таблицы.

Рассмотрим пример, когда мы хотим создать таблицу первых пяти строчных букв и их индексов в алфавите.

Затем мы используем эту таблицу для перевода строки, в которой все символы “a”, “b”, “c”, “d” и “e” заменены на “0”, “1”, “2”, “3” и “4” соответственно, а остальные символы не тронуты.

Для создания таблицы мы будем использовать функцию maketrans() модуля str.

Этот метод принимает в качестве первого параметра строку символов, для которых требуется перевод, и другой параметр такой же длины, содержащий сопоставленные символы для каждого символа первой строки.

Давайте создадим таблицу для простого примера.

Таблица представляет собой словарь Python, в котором в качестве ключей указаны значения символов Unicode, а в качестве значений – их соответствующие отображения.

Теперь, когда у нас есть готовая таблица, мы можем переводить строки любой длины с помощью этой таблицы.

К счастью, за перевод отвечает другая функция модуля str, называемая translate.

Давайте используем этот метод для преобразования нашего текста с помощью нашей таблицы.

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

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

Что можно сделать, если вместо букв печатаются цифры?

Если у вас появилась подобная проблема, то необходимо старательно изучить клавиатуру вашего ПК и рассмотреть, как похожи скриншоты, представленные в этой статье. В вашем ноутбуке присутствуют подобные цифры на кнопках J, K, L? А кнопочка Num Lock (num lk, Nm Lock, NmLk), находится в верхней части клавиатуры и в большинстве случаев на ней ещё имеется другая надпись. На части настольных компьютеров на этой клавише показан замок, или определённая цифра, или буква?

Если это так, то значит, вы нечаянно задействовали клавишу Num Lock, поэтому определённые клавиши справа клавиатуры начали набирать цифры (иногда такая раскладка знаков на клавиатуре действительно удобна). Если вы желаете выключить, или включить эту клавишу ноутбука, то необходимо кликнуть по клавишам Fn + Num Lock, Fn + F11 или просто нажать NumLock (не нужно нажимать клавишу Fn).

Но, при этом, на многих настольных компьютерах (по большей части имеется зависимость от бренда и варианта ноутбука) включение и выключение данной опции Num Lock возникает, когда вы нажимаете её совместно с клавишей Fn. На других ноутбуках без подобной вариации, просто нужно нажать на эту клавишу. Стоит проверить оба метода. Как видно выше, сама надпись на подобной кнопке вполне возможно будет другая, в основном, в сокращённом виде. Но, вы её с лёгкостью угадаете.

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

Внедрение шифрования

Давайте создадим функцию caesar_cipher(), которая принимает строку для шифрования/дешифрования, “набор символов”, показывающий, какие символы в строке должны быть зашифрованы (по умолчанию это будет строчный регистр),

ключ, а также булево значение, показывающее, была ли произведена расшифровка (шифрование) или нет.

Это очень мощная функция!

Вся операция смены была сведена к операции нарезки.

Кроме того, мы используем атрибут string.ascii_lowercase – это строка символов от “a” до “z”.

Еще одна важная особенность, которой мы здесь достигли, заключается в том, что одна и та же функция обеспечивает как шифрование, так и дешифрование; это можно сделать, изменив значение параметра ‘key’.

Операция вырезания вместе с этим новым ключом гарантирует, что набор символов был сдвинут влево – то, что мы делаем при расшифровке сдвинутого вправо шифротекста Цезаря.

Давайте проверим, работает ли это на предыдущем примере.

Мы зашифруем только заглавные буквы текста и передадим то же самое параметру “characters”.

Зашифруем текст: “HELLO WORLD! Welcome to the world of Cryptography!”.

Посмотрите, как часть “KHOOR ZRUOG” соответствует шифрованию “HELLO WORLD” с ключом 3 в нашем первом примере.

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

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

Если мы можем получить наш исходный текст, значит, наша функция работает идеально.

Обратите внимание, как мы установили параметр “decrypt” нашей функции в True. Поскольку мы восстановили наш оригинальный текст, это признак того, что наш алгоритм шифрования-дешифрования с использованием таблицы поиска работает отлично!

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

Теперь давайте посмотрим, можно ли расширить набор символов, включив в него не только строчные и прописные символы, но и цифры и знаки препинания.

Здесь мы включаем все символы, которые мы обсуждали до сих пор (включая символ пробела), в набор символов для кодирования.

В результате все (даже пробелы) в нашем обычном тексте было заменено другим символом!

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

Это означает, что “Y” со смещением 3 не станет “B”, а будет закодирован как “1”.

Стойкость шрифта

Криптографическая стойкость алгоритма шифрования — это способность противостоять взлому. Данный параметр является самым важным для любого шифрования. Очевидно, что шифр простой замены, расшифровку которого осилит любое электронное устройство, является одним из самых нестойких.

На сегодняшний день не существует единых стандартов, по которым можно было бы оценить стойкость шифра. Это трудоемкий и долгий процесс. Однако есть ряд комиссий, которые изготовили стандарты в этой области. Например, минимальные требования к алгоритму шифрования Advanced Encryption Standart или AES, разработанные в NIST США.

Для справки: самым стойким шифром к взлому признан шифр Вернама. При этом его плюсом является то, что по своему алгоритму он является простейшим шифром.

Алгоритм шифрования ADFGX

Это самый известный шифр Первой мировой войны, используемый немцами. Свое имя шифр получил потому, что алгоритм шифрования приводил все шифрограммы к чередованию этих букв. Выбор самих же букв был определен их удобством при передаче по телеграфным линиям. Каждая буква в шифре представляется двумя. Рассмотрим более интересную версию квадрата ADFGX, которая включает цифры и называется ADFGVX.

A D F G V X
A J Q A 5 H D
D 2 E R V 9 Z
F 8 Y I N K V
G U P B F 6 O
V 4 G X S 3 T
X W L Q 7 C

Алгоритм составления квадрата ADFGX следующий:

  1. Берем случайные n букв для обозначения столбцов и строк.
  2. Строим матрицу N x N.
  3. Вписываем в матрицу алфавит, цифры, знаки, случайным образом разбросанные по ячейкам.

Составим аналогичный квадрат для русского языка. Например, создадим квадрат АБВГД:

А Б В Г Д
А Е/Е Н Ь/Ъ А И/Й
Б Ч В/Ф Г/К З Д
В Ш/Щ Б Л Х Я
Г Р М О Ю П
Д Ж Т Ц Ы У

Данная матрица выглядит странно, так как ряд ячеек содержит по две буквы. Это допустимо, смысл послания при этом не теряется. Его легко можно восстановить. Зашифруем фразу «Компактный шифр» при помощи данной таблицы:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
Фраза К О М П А К Т Н Ы Й Ш И Ф Р
Шифр бв гв гб гд аг бв дб аб дг ад ва ад бб га

Таким образом, итоговое зашифрованное послание выглядит так: «бвгвгбгдагбвдбабдгвдваадббга». Разумеется, немцы проводили подобную строку еще через несколько шифров. И в итоге получалось очень устойчивое к взлому шифрованное послание.

Отрицательное смещение

До сих пор мы выполняли “положительный” или “правый” сдвиг символов в процессе шифрования. А процесс дешифровки для него же включал “отрицательный” или “левый” сдвиг символов.

Но что если мы хотим выполнить процесс шифрования с отрицательным сдвигом – изменится ли наш алгоритм шифрования-дешифрования?

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

Давайте попробуем это сделать, изменив нашу предыдущую функцию, добавив еще один параметр – ‘shift_type’ в нашу функцию cipher_cipher_using_lookup().

Давайте попробуем этот модифицированный метод на простом тексте:

Обратите внимание, что каждый из символов нашего обычного текста сдвинут на три позиции влево. Теперь проверим процесс расшифровки с помощью той же строки

Теперь проверим процесс расшифровки с помощью той же строки.

Таким образом, мы можем зашифровать и расшифровать текст, используя таблицу поиска и отрицательный ключ.