Как работает шифр вернама
Перейти к содержимому

Как работает шифр вернама

  • автор:

Шифр Вернама (одноразовый блокнот)

Шифр Вернама (одноразовый блокнот) — единственный известный абсолютно секретный шифр. Он основан на том, что сообщение кодируется побитовым xor с одноразовым ключом, длина которого не меньше длины передаваемого сообщения.

[math]E_k(x_1) = x_1 \oplus k[/math]

[math]D_k(x_1 \oplus k \oplus k) = x_1[/math]

Шифр назван в честь телеграфиста Гильберта Вернама, который сконструировал телеграфный аппарат, автоматически кодирующий сообщения таким методом (ключ подавался на отдельной ленте).

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

Доказательство абсолютной секретности:

Пусть кодируемое слово — [math]x[/math] , ключ [math]k[/math] , результат кодирования [math] y = x \oplus k [/math] . Таким образом [math]P(y=y_0) = P(k = y_o \oplus x)[/math] . Заметим, что при фиксированном [math]x[/math] , каждому случайному [math]k[/math] соответствует ровно один [math]y[/math] , а значит и распределение [math]y[/math] будет совпадать с распределением ключа, из чего следует, что [math]\forall x_1 \neq x_2[/math] [math] f(y_1 \oplus k) = f(y_2 \oplus k)[/math] , что и требовалось доказать.

Шифр Вернама

Семейство международных стандартов на такие функции называется SHA (secure hash algorithm), в России существуют аналоги в виде ГОСТов. На данный момент самой надёжной функцией считается SHA3, основанная на алгоритме Keccak[3].

При выполнении лабораторных работ следует пользоваться алгоритмами с уровнем безопасности не ниже чем у алгоритма MD5. Рассмотрим подробнее именно этот алгоритм, ставший в своё время основой для первого семейства криптографических функций SHA1. Подробное описание алгоритма можно найти в [4]. Естественно при этом допускается реализовывать функцию самому, а применить любую из уже разработанных библиотек (например, openssl[5]).

Ниже приведем пример использования библиотеки openssl:

unsigned char digest[SHA256_DIGEST_LENGTH];

const char* string = «hello world»;

printf(«SHA256 digest: %s\n», mdString);

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

Электронная подпись

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

  1. Подписать документ от своего имени может только один человек, т.е. невозможно подделать подпись другого человека.
  2. Автор подписи не может от неё отказаться, в случае споров должно быть возможно привлечение третьих сторон (например, суда) для подтверждения подлинности подписи.
  3. Подпись должна защищать целостность документа и подтверждать, что подписавший его человек ознакомлен с содержимым.

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

Уточнение по реализации лабораторных работ по теме «электронная подпись»:

В рамках лабораторной работы необходимо использовать криптографическую хэш-функцию с уровнем безопасности не ниже md5. Все подобные функции формируют в качестве хэш-функции файла большое число размером 16/32/64 байт. Рассматриваемые ниже алгоритмы подписи предполагают работу с результатом хэш-функции как с одним числом, и это условие действительно будет выполнено, если во всех алгоритмах использовать «длинную арифметику» и работать с числами порядка 1024 бита. Тем не менее, так как требования к лабораторным работам позволяют использовать стандартные типы данных, предлагается следующий подход. Представить значение хэш-фукнции как массив байт, и каждый из этих байт подписать отдельно, применив к нему алгоритм подписи с одними и теми же изначальными параметрами (общие данные, секретный и открытый ключи).

Шифр Вернама

Шифр Вернама (другое название: англ. One-time pad — схема одноразовых блокнотов) — в криптографии система симметричного шифрования, изобретённая в 1917 году сотрудниками AT&T Мейджором Джозефом Моборном и Гильбертом Вернамом. Шифр Вернама является системой шифрования, для которой доказана абсолютная криптографическая стойкость.

Описание

Для произведения шифротекста открытый текст объединяется операцией «исключающее ИЛИ» с ключом (называемым одноразовым блокнотом или шифроблокнотом). При этом ключ должен обладать тремя критически важными свойствами:

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

Шифр назван в честь телеграфиста AT&T Гильберта Вернама, который в 1917 году построил телеграфный аппарат, который выполнял эту операцию автоматически — надо было только подать на него ленту с ключом. Не будучи шифровальщиком, тем не менее, Вернам верно заметил важное свойство своего шифра — каждая лента должна использоваться только один раз и после этого уничтожаться. Это трудноприменимо на практике — поэтому аппарат был переделан на несколько закольцованных лент с взаимно простыми периодами.

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

Область применения

Примерный вид страницы шифроблокнота

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

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

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

Не является шифром Вернама, но близка к нему схема одноразовых кодов: например, кодовое слово «Альфа» означает «Возвращаюсь».

Недостатки

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

-Проблемой является тайная передача последовательности и сохранение её в тайне. Если существует надёжно защищённый от перехвата канал передачи сообщений, шифры вообще не нужны: секретные сообщения можно передавать по этому каналу. Если же передавать ключ системы Вернама с помощью другого шифра (например, DES), то полученный шифр окажется защищённым ровно настолько, насколько защищён DES. При этом, поскольку длина ключа та же, что и длина сообщения, передать его не проще, чем сообщение. Шифроблокнот на физическом носителе можно украсть или скопировать.

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

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

-Шифр Вернама чувствителен к любому нарушению процедуры шифрования. Бывали случаи, когда одна и та же страница блокнота по различным причинам применялась дважды. Например, среди всего объёма советской шифрованной переписки, перехваченной АНБ США в период 40-х годов прошлого века, были обнаружены сообщения, закрытые дважды использованной гаммой. Период этот длился не очень долго, потому что уже после первых успехов американских криптоаналитиков в конце 1940-х годов в спецслужбах СССР узнали о серьёзных проблемах с надёжностью своей шифрпереписки. Такие сообщения были расшифрованы в течение 40 последующих лет в рамках секретного проекта «Venona», документы которого были не так давно рассекречены и выложены на сайте АНБ.

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

Ссылки

  • http://students.uni-vologda.ac.ru/pages/pm00/kan/symmetric.htm
  • offline.computerra.ru/1999/305/3111
  • www.agentura.ru/press/about/jointprojects/confident/crypto19end
  • А. Синельников Шифры советской разведки
  • Шифроблокнот КГБ (англ.)
  • Dirk Rijmenants’ One-time Pad (англ.)
  • Dirk Rijmenants’ The Manual One-time Pad (англ.)
  • THE VENONA STORY [1]
  • Берд Киви. Цена ошибки [2]

Элементарные шифры на понятном языке

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

Прежде всего, разберемся в терминологии.

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

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

Шифрованное сообщение – это сообщение, прошедшее процесс шифрования.

Шифр — это сам алгоритм, по которому мы преобразовываем сообщение.

Ключ — это компонент, на основе которого можно произвести шифрование или дешифрование.

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

Шифр Атбаша

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

a b c d e f g h i j k l m n o p q r s t u v w x y z

Для реализации шифра Атбаша просто инвертируем его. «А» станет «Z», «B» превратится в «Y» и наоборот. На выходе получим такую картину:

И теперь пишем нужное сообшение на исходном алфавите и алфавите шифра

Исходное сообщение: I love habr
Зашифрованное: r olev szyi

Шифр Цезаря

Опять же, для наглядности, возьмем латиницу

a b c d e f g h i j k l m n o p q r s t u v w x y z

И теперь сместим вправо или влево каждую букву на ключевое число значений.

Например, ключ у нас будет 4 и смещение вправо.

Исходный алфавит: a b c d e f g h i j k l m n o p q r s t u v w x y z
Зашифрованный: w x y z a b c d e f g h i j k l m n o p q r s t u v

Пробуем написать сообщение:

hello world

Шифруем его и получаем следующий несвязный текст:

dahhk sknhz

Шифр Вернама (XOR-шифр)

Исходный алфавит — все та же латиница.

Сообщение разбиваем на отдельные символы и каждый символ представляем в бинарном виде.
Классики криптографии предлагают пятизначный код бодо для каждой буквы. Мы же попробуем изменить этот шифр для кодирования в 8 бит/символ на примере ASCII-таблицы. Каждую букву представим в виде бинарного кода.

image

Теперь вспомним курс электроники и элемент «Исключающее ИЛИ», также известный как XOR.

XOR принимает сигналы (0 или 1 каждый), проводит над ними логическую операцию и выдает один сигнал, исходя из входных значений.

Если все сигналы равны между собой (0-0 или 1-1 или 0-0-0 и т.д.), то на выходе получаем 0.
Если сигналы не равны (0-1 или 1-0 или 1-0-0 и т.д.), то на выходе получаем 1.

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

сообщение: LONDON
ключ: SYSTEM

Переведем их в бинарный код и выполним XOR:

01001100 01001111 01001110 01000100 01001111 01001110 01010011 01011001 01010011 01010100 01000101 01001101 _______________________________________________________ 00011111 00010110 00011101 00010000 00001010 00000011

В данном конкретном примере на месте результирующих символов мы увидим только пустое место, ведь все символы попали в первые 32 служебных символа. Однако, если перевести полученный результат в числа, то получим следующую картину:

31 22 29 16 10 3. 

С виду — совершенно несвязный набор чисел, но мы-то знаем.

Шифр кодового слова

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

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

Придумаем кодовое слово. Например, «Лукоморье». Выдернем из него все повторяющиеся символы. На выходе получаем слово «Лукомрье».

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

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

И теперь запишем любое сообщение и зашифруем его.

"Златая цепь на дубе том"

Получим в итоге следующий нечитаемый бред:

"Адлпля хриы жл мсур пиё"

Шифр Плейфера

Пусть кодовое слово у нас будет «HELLO».

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

Теперь возьмем любое сообщение. Например, «I LOVE HABR AND GITHUB».

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

IL OV EH AB RA ND GI TH UB.

Если бы сообщение было из нечетного количества символов, или в биграмме были бы два одинаковых символа (LL, например), то на место недостающего или повторившегося символа ставится символ X.

Шифрование выполняется по нескольким несложным правилам:

1) Если символы биграммы находятся в матрице на одной строке — смещаем их вправо на одну позицию. Если символ был крайним в ряду — он становится первым.

Например, EH становится LE.

2) Если символы биграммы находятся в одном столбце, то они смещаются на одну позицию вниз. Если символ находился в самом низу столбца, то он принимает значение самого верхнего.

Например, если бы у нас была биграмма LX, то она стала бы DL.

3) Если символы не находятся ни на одной строке, ни на одном столбце, то строим прямоугольник, где наши символы — края диагонали. И меняем углы местами.

Например, биграмма RA.

По этим правилам, шифруем все сообщение.

IL OV EH AB RA ND GI TH UB. KO HY LE HG EU MF BP QO QG

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

KOHYLEHGEUMFBPQOQG

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

Спасибо за внимание.

  • для начинающих
  • шифрование данных

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *