Системы шифрования текста от древнего рима до наших дней

Введение в терминологию шифров

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

Код

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

шифровать

Шифры заменяют открытый текст шифротекстом. Никакого значения этому процессу не приписывается, это математическая или механическая операция, предназначенная просто для запутывания открытого текста. Например: алгоритм «вращения 13» (ROT13), в котором буквам назначается буква 13, расположенная после нее в алфавите. Это приводит к A = N, B = O и т. Д. Чтобы зашифровать или расшифровать сообщение, человек должен знать только алгоритм.

Зашифрованный текст

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

пространство ключей

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

гашиш

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

Отличительными чертами хорошего хеширующего шифра являются:

  1. Это детерминированный; Это означает, что одно и то же сообщение, проходящее через один и тот же хэш-шифр, всегда будет давать один и тот же отпечаток, и
  2. Имеет низкий уровень столкновения; Это означает, что разные сообщения, проходящие через один и тот же хэш-шифр, должны создавать разные отпечатки.

Моноалфавитные шифры

Шифр, который использует один алфавит и обычно представляет собой простое преобразование. Например, буква A будет представлена ​​буквой F.

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

Некоторые примеры моноалфавитных шифров:

  • Цезарь Шифр
  • Шифр Свинья
  • Шифр Playfair
  • Азбука Морзе (несмотря на название)

Простой текст

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

Полиалфабетические шифры

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

Вот некоторые примеры полиалфавитных шифров:

  • Альберти Шифр
  • Vigenère шифр

Симметричные / асимметричные ключи

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

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

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

Давайте создадим функцию 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”.

Все тайнописи имеют системы

1. Акростих

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

Вот, например, стихотворение-загадка с разгадкой в первых буквах:

Д
овольно именем известна я своим;Р
авно клянётся плут и непорочный им,У
техой в бедствиях всего бываю боле,Ж
изнь сладостней при мне и в самой лучшей доле.Б
лаженству чистых душ могу служить одна,А
меж злодеями — не быть я создана. Юрий Нелединский-Мелецкий

Сергей Есенин, Анна Ахматова, Валентин Загорянский часто пользовались акростихами.

2. Литорея

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

употребляют в письме верхние буквы вместо нижних и наоборот, причём гласные остаются без перемены; так, например, токепот = котёнок
и т. п.

Мудрая литорея
предполагает более сложные правила подстановки.

3. «ROT1»

— шифр для детишек?

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

А заменяется на Б, Б заменяется на В и так далее. «ROT1» буквально означает «вращать на 1 букву вперёд по алфавиту». Фраза «Я люблю борщ»
превратится в секретную фразу «А мявмя впсъ»
. Этот шифр предназначен для развлечения, его легко понять и расшифровать, даже если ключ используется в обратном направлении.

4. От перестановки слагаемых…

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

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

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

5. Сдвижной шифр Цезаря

Он состоит из 33 различных шифров, по одному на каждую букву алфавита (количество шифров меняется в зависимости от алфавита используемого языка). Человек должен был знать, какой шифр Юлия Цезаря использовать для того, чтобы расшифровать сообщение. Например, если используется шифр Ё, то А становится Ё, Б становится Ж, В становится З и так далее по алфавиту. Если используется шифр Ю, то А становится Ю, Б становится Я, В становится А и так далее. Данный алгоритм является основой для многих более сложных шифров, но сам по себе не обеспечивает надёжную защиту тайны сообщений, поскольку проверка 33-х различных ключей шифра займёт относительно небольшое время.

Функция chr()

Точно так же, как при преобразовании символа в его числовой Юникод с помощью метода ord(), мы делаем обратное, то есть находим символ, представленный числом, с помощью метода chr().

Метод chr() принимает число, представляющее Unicode символа, и возвращает фактический символ, соответствующий числовому коду.

Давайте сначала рассмотрим несколько примеров:

Обратите внимание, что немецкая буква Ü также представлена в Юникоде числом 360. Мы можем применить процедуру цепочки (ord, затем chr), чтобы восстановить исходный символ

Мы можем применить процедуру цепочки (ord, затем chr), чтобы восстановить исходный символ.

Шифр Вернама — это сложно

Теперь попробуем объяснить подробнее. 

1. Сообщение хранится в виде битов данных. Допустим, мы шифруем текст. Компьютер не умеет работать с текстом как таковым, он этот текст хранит как набор числовых кодов (проще говоря, у компьютера все буквы пронумерованы и он помнит только эти номера).

Числа, в свою очередь, компьютер хранит в виде двоичного кода, то есть битов данных. Это пока что не относится к шифрованию, это просто то, как хранится любая текстовая информация в компьютере.

Буква Код в ASCII Биты данных
K 75 01001011
O 79 01001111
D 68 01000100

Если мы напишем KOD в кодировке ASCII, то для компьютера это будет последовательность из трёх чисел, а каждое число — это набор битов: 

01001011 01001111 01000100

2. Берём случайные биты в качестве ключа шифрования. На входе у нас три числа по 8 бит. Чтобы их зашифровать, нам нужны 24 случайных бита. Возьмём их с потолка, они ничего не значат: 

10101101 01111010 10101011

3. Накладываем коды друг на друга и применяем алгоритм шифрования. Шифр Вернама построен на принципе «исключающего ИЛИ», он же XOR. Он смотрит на каждую пару битов и пытается понять, они одинаковые или разные. Если биты одинаковые, результат проверки будет 0, если разные — 1.

Можно проверить себя так: XOR задаёт вопрос «Эти биты разные»? Если да — то 1, если нет — то 0.

Буква K 1 1 1 1
Ключ 1 1 1 1 1
XOR (Они разные?) 1 1 1 1 1

Если мы таким образом закодируем три буквы, мы получим три новых набора битов: 

KOD (сообщение) 01001011 01001111 01000100
Ключ 10101101 01111010 10101011
Результат шифрования с помощью XOR 11100110 00110101 11101111

Получается, что на входе у нас было 24 бита данных и на выходе 24 бита данных. Но эти данные теперь совсем другие. Если перевести эти числа обратно в текст, мы получим: 

KOD  →  æ5ï

Как правильно хранить пароли?

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

  • Возможен взлом самой программы.
  • Сегодня программа есть – а завтра ее закрыли. А вам предстоит увлекательный квест по переносу паролей в новую программу.
  • Программа была установлена на устаревшей ОС на старом «железе», сгорела материнская плата, и ваша операционная система не загружается на другом компьютере. И вы ищете такое же «железо» или пытаетесь вытащить пароли через техподдержку программы (если она, конечно, есть, и пароли синхронизируются куда-то кроме вашего компьютера – что, кстати, является потенциальной дополнительной уязвимостью).

Простой способ хранить сложные пароли

При этом абсолютно любые пароли можно хранить хоть в текстовом файле «пароли.txt» на рабочем столе, при одном условии. Вот оно:

Например, ваш список паролей может выглядеть так:

  1. 5g~|r57C%llRWL0
  2. w8T?hl$oPf69l*@
  3. qo9n76R2Xlk89g%
  4. INV8K3mbPQrONQv
  5. p~Uw~EpU5H05PQo

Но он будет бесполезен, если не знать, как ими пользоваться. В примере выше – 5 паролей. И только вы знаете, что первый пароль рабочий, если удалить первый символ, второй – если удалить второй. Таких вариантов, к которым практически невозможно подобрать закономерность, много:

  • В любом пароле нужно удалить 2-ю заглавную букву.
  • Два первых (или последних) символа – лишние. Или второй и четвертый.
  • Пароль правильный, если к нему дописать gfhjkmxbr («парольчик» в английской раскладке).
  • Пароль нужно скопировать 2 раза и удалить 2 последних символа (какой по вашему шанс подобрать методом перебора 28-символьный пароль?).
  • Ваш вариант.

Теоретически, даже такой пароль подобрать можно. Практически – вы думаете, кому-то это нужно? Кроме этого, если пароль от онлайн-сервиса, то методом перебора его подобрать не получится, по следующим причинам:

  1. Все больше сервисов уходят к двухфакторной авторизации (пароль + смс), в платежных системах это уже фактически стало стандартом.
  2. Не только вы знаете, что пароль можно попытаться подобрать методом перебора вариантов. Чаще всего в онлайн-сервисах после 3-5 попыток нужно подождать от 3 минут до получаса.

Зашифрованный архив

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

В принципе, небольшой объем информации можно шифровать просто бесплатным архиватором 7-zip, который поддерживает шифрование алгоритмом AES-256 для форматов 7z и ZIP. Этот вариант подойдет, например, для съемных носителей, которые по тем или иным причинам нельзя шифровать другими вариантами (нужно что-то скидывать на компьютеры без спецсофта).

Transcribe

Вы заливаете свою аудиозапись или копируете ссылку на видео YouTube в Transcribe — сервис выдаёт вам расшифровку. Нет ничего проще. Правда, как и во всех подобных инструментах, результат будет совсем не идеален, так что от редактуры и вычитки всё равно не избавиться.

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

Опробовать Transcribe можно бесплатно, но для регулярного использования сервиса придётся купить подписку за 20 долларов в год. За дополнительные возможности вроде машинной транскрипции и автоматической простановки временных кодов придётся платить ещё 6 долларов в час. Сервис на английском, но русский язык поддерживает тоже.

Открыть Transcribe →

Одноразовый блокнот

Этот шифр, созданный в 1917 году Гильбертом Вернамом, очень надежен, поскольку методов его взлома не существует (в частности, неприменим метод прямого подбора, основанный на переборе всех возможных сочетаний символов для определения их правильного порядка). Существуют две версии этого шифра: на основе двоичного ключа и стандартного (буквенного) ключа. Они различаются способом шифрования текста: первая использует алгоритм объединения шифруемого текста с ключом при помощи операции «исключающее ИЛИ» (XOR), вторая – алгоритм Виженера. Ключ обладает высочайшей эффективностью благодаря своей длине (которая совпадает с длиной самого сообщения), тому, что он представляет собой случайную последовательность, и тому, что он используется только один раз. Ответ отправителю генерируется с помощью нового ключа. Несмотря на то, что оба алгоритма («исключающее ИЛИ» и алгоритм Виженера) по сути являются подстановочными шифрами, при выполнении трех упомянутых условий (длина ключа, его случайность и одноразовость) этот метод шифрования обладает абсолютной криптостойкостью. В приведенном ниже примере я рассмотрю двоичный метод, то есть алгоритм, основанный на использовании логического оператора «исключающее ИЛИ» (XOR).

Операция XOR называется также разделительной дизъюнкцией. Если из операндов p и q один (но не оба) является истинным (т.е. имеет значение 1), то выражение p XOR q также истинно. В противном случае оно ложно.

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

Записав сообщение в двоичной системе, нужно создать пароль

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

Лучшим решением этой проблемы был бы генератор, использующий, к примеру, случайный характер и изменчивость величин температуры компьютерных компонентов (например, процессора). Чтобы проиллюстрировать процесс шифрования, основанный на данном методе, были сгенерированы следующие числа:

Следующий шаг – выполнение операции разделительной дизъюнкции (XOR):

Будучи зашифрованным, наше сообщение примет следующий вид:

Поскольку созданный пароль используется только один раз, составляющие его числа случайны, а его длина совпадает с длиной шифруемого сообщения, данный вид шифрования известен как шифрование OTP (от английского One-Time Password – одноразовый пароль), поскольку пароль используется лишь один раз и после этого становится бесполезным. Пытаться взломать пароль бессмысленно, потому что без ключа воссоздать исходное сообщение невозможно, ведь последовательность символов в зашифрованном тексте случайна в той же степени, в какой и последовательность символов в ключе. Зная результат разделительной дизъюнкции, можно пытаться по одному заменять символы и вычислять пароль на основе получившейся комбинации. Но если мы не знаем, правильно ли произведена замена, пароль нам выяснить не удастся – тем более, что он использован лишь однажды. Поэтому криптоанализ, основанный на частоте, с которой встречаются определенные символы или сочетания символов (как в подстановочных шифрах), невозможен – ведь эта характеристика будет меняться от одного сообщения к другому.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Стеганография является более древней, чем коды и шифры, и обычно её называют тайнописью, искусством скрытой записи. Например, сообщение может быть написано на бумаге, покрытой воском, и гонец должен проглотить его и таким образом обеспечить скрытность, а в нужный момент отрыгнуть, чтобы сообщение можно было прочитать. Другим способом является татуировка сообщения на гладко выбритой голове посланника, затем надо подождать, когда волосы опять вырастут, чтобы скрыть сообщение. Лучший способ тайнописи — это использование обычных предметов для сокрытия сообщения. В Англии был популярен метод тайнописи, для которого использовали обычную газету с крошечными точками под буквами на первой странице, которые указывали, какие буквы следует читать, чтобы получить сообщение. Некоторые люди могли составить сообщение, используя первые буквы каждого слова в каком-либо тексте или используя невидимые чернила. Конкурирующие страны могут так уменьшить текст, что целая страница текста становится размером с пиксель, который будет незаметен для постороннего глаза. Стеганографию лучше всего использовать в сочетании с кодом или шифром, так как существует риск, что тайное послание может быть обнаружено.

ADFGVX

Этот шифр, представляющий собой усовершенствованный вариант более раннего шифра ADFGX, использовали в Германии во время Первой мировой войны для шифрования команд и распоряжений. Алгоритм состоит в сопоставлении пары букв (используются только буквы A, D, F, G, V и X) каждой букве шифруемого текста. Чтобы затруднить криптографический анализ, используется ключевое слово и таблица, заполненная буквами и цифрами. В распоряжении адресата зашифрованного сообщения должны быть как ключевое слово, так и цифро-буквенная таблица. Пример такой таблицы приведен на следующем рисунке:

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

K — FV
A — GX
S — AG
P — AV
E — VA
R — VD
S — AG
K — FV
Y — XF

Следующий шаг – выбор пароля. Остановимся на слове SZYFR (ШИФР по-польски). Далее последовательно вводим пары букв, полученные при шифровании слова Kaspersky из таблицы ADFGVX, в новую таблицу. В каждом столбце должно быть одинаковое количество букв, и если для заполнения таблицы имеющихся букв не хватает, то надо их добавить. В данном случае двум последним буквам в таблице соответствует число 0.

Последний шаг – расстановка столбцов, начинающихся с букв ключевого слова, в алфавитном порядке.

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Курс на развитие
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: