Содержание статьи
- Roadmap
- Блочное и поточное шифрование
- Поточное шифрование
- Блочное шифрование
- Сеть Фейстеля
- ГОСТ 28147—89 (Магма)
- Режим простой замены
- Режим гаммирования
- Режим гаммирования с обратной связью
- Режим имитовставки
- ГОСТ 34.12—2015 (Кузнечик)
- Режим простой замены с зацеплением
- Режим гаммирования с обратной связью по выходу
- Где же оно все-таки надо?
Ты уже познакомился с историческими шифрами, узнал о распределении ключей. Теперь настал момент погрузиться с головой в современную криптографию. Ее методы куда более изощренные, нежели у исторических шифров. Попробуем разобраться, что такое сеть Фейстеля и какие отечественные блочные шифры используются в современных протоколах. Все просто, понятно и с примерами. Велком!
Roadmap
Это третий урок из цикла «Погружение в крипту». Все уроки цикла в хронологическом порядке:
- Урок 1. Исторические шифры. Основы и исторические шифраторы. Как работают (и анализируются) шифры сдвига, замены, Рихарда Зорге, шифр Вернама и шифровальные машины
- Урок 2. Распределение ключей. Что это такое, как выполняется распределение ключей и как выбрать криптостойкий ключ
- Урок 3. Современные отечественные шифры. Что такое сеть Фейстеля и какими бывают отечественные блочные шифры, используемые в современных протоколах, — ГОСТ 28147—89, «Кузнечик» (ты здесь)
- Урок 4. Современные зарубежные шифры. В чем разница между 3DES, AES, Blowfish, IDEA, Threefish от Брюса Шнайера и как они работают
- Урок 5. Электронная подпись. Виды электронных подписей, как они работают и как их использовать
- Урок 6. Квантовая криптография. Что это такое, где используется и как помогает в распределении секретных ключей, генерации случайных чисел и электронной подписи
Блочное и поточное шифрование
Как ты помнишь, шифр сдвига, замены, перестановки и шифр Вернама применяют операцию к каждому конкретному символу текста. Нужно сдвинуть — сдвигаем символ, применить ключ — применяем к символу, за ним к следующему символу и так далее, пока не зашифруем все символы открытого текста. Такой метод шифрования называется поточным — мы шифруем каждый символ в отдельности. Есть и другой подход: разбить исходный открытый текст на группы по несколько символов (блоки) и выполнять операции шифрования в каждом блоке. Это — блочный метод шифрования.
Чтобы отличие между блочными и поточными шифрами стало понятнее, приведем пример на простом шифре замены.
Поточное шифрование
Зашифруем поточным шифром замены слово CIPHER:
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 |
b | e | x | g | w | i | q | v | l | o | u | m | p | j | r | s | t | n | k | h | f | y | z | a | d | c |
С | I | P | H | E | R |
X | L | S | V | W | N |
Зашифровали каждый символ и получили шифротекст. Проще простого.
Блочное шифрование
Зашифруем слово AVADAKEDAVRA. Поскольку шифр блочный, открытый текст разобьем на блоки по четыре символа: AVAD | AKED | AVRA. На практике блоки текста состоят из 64‒256 бит. Для каждого блока придумаем свою таблицу замены:
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 |
b | e | x | g | w | i | q | v | l | o | u | m | p | j | r | s | t | n | k | h | f | y | z | a | d | c |
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 |
p | g | x | e | n | v | c | i | l | h | u | j | b | m | r | s | w | t | k | o | f | d | z | a | y | q |
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 |
x | w | b | g | s | q | i | v | l | c | u | m | p | o | r | j | t | m | k | n | f | y | h | a | z | d |
А теперь шифруем каждый из блоков соответствующим алфавитом:
|
|
|
Получилось чуть лучше, нежели с поточным подходом, если говорить о стойкости. Ведь обычный шифр замены мы научились дешифровать одной левой. А при таком блочном подходе злоумышленнику придется изрядно поломать голову, прежде чем он сможет подобрать длину блока и уже тогда для каждого блока применить криптоанализ для шифров замены.
Сеть Фейстеля
Теперь мы готовы перейти к очень важной теме, которая открывает дверь в бескрайний мир современных систем шифрования. Сеть Фейстеля — это метод блочного шифрования, разработанный Хорстом Фейстелем в лаборатории IBM в 1971 году. Сегодня сеть Фейстеля лежит в основе большого количества криптографических протоколов. Попробуем разобрать «на пальцах», что же она собой представляет.
Сеть Фейстеля оперирует блоками открытого текста, поэтому мы рассмотрим механизм ее работы на одном из блоков. С остальными блоками действия будут аналогичны.
- Блок разбивается на две равные части — левую (L) и правую (R).
- После разбиения левый подблок изменяется функцией f с использованием ключа K:
x = f(L, K)
. В качестве функции можно представить себе какое угодно преобразование — например, старый добрый шифр сдвига с ключом K. - Полученный подблок складывается по модулю 2 с правым подблоком R, который до этого был не у дел:
x = x⊕R
. - Далее полученные части меняются местами и склеиваются.
Как видишь, все достаточно просто. Для того чтобы понять, как это работает, посмотри на схему:
Xakep #207. Дистанционное банковское ограбление
Такая схема называется ячейкой Фейстеля. Сама сеть Фейстеля состоит из нескольких ячеек. Полученные на выходе первой ячейки подблоки поступают на вход второй ячейки, результирующие подблоки из второй ячейки попадают на вход третьей ячейки и так далее в зависимости от количества раундов сети Фейстеля. В каждом таком раунде применяется заранее определенный раундовый ключ. Чаще всего раундовые ключи выработаны из основного секретного ключа K. Когда все раунды будут пройдены, подблоки текста склеиваются, и получается нормальный такой шифротекст.
Теперь посмотрим работу сети Фейстеля на примере. Возьмем слово AVADAKEDAVRA и разобьем его на два блока по шесть символов — AVADAK | EDAVRA. За функцию возьмем шифр сдвига на число позиций, определенных раундовым ключом. Пусть секретный ключ K = [1, 2]
. В качестве раундовых ключей возьмем K[0] = 1, K[1] = 2
. Для сложения по модулю 2 переведем текст в двоичный код согласно телеграфному алфавитику, которым вряд ли кто-то еще пользуется вообще.
Вот что получилось:
A | V | A | D | A | K | E | D | A | V | R | A |
00011 | 11110 | 00011 | 01001 | 00011 | 01111 | 00001 | 01001 | 00011 | 11110 | 01010 | 00011 |
Теперь прогоним через сеть Фейстеля из двух раундов первый блок:
Второй блок попробуй зашифровать сам, у меня получилось MOSSTR.
Расшифрование осуществляется точно так же: шифротекст разбивается на блоки и затем подблоки, левый подблок поступает в функцию, складывается по модулю 2 с правым, и затем подблоки меняются местами. Отличие заключается в том, что раундовые ключи подаются в обратном порядке, то есть в нашем случае в первом раунде применим ключ K = 2, а затем во втором раунде K = 1.
Исследования сети Фейстеля показали, что при независимых раундовых ключах и криптостойкой псевдослучайной функции f трех раундов сети Фейстеля будет достаточно, чтобы шифротекст был псевдослучайным. Это говорит о том, что шифры, основанные на сети Фейстеля, на данный момент достаточно криптостойки.
ГОСТ 28147—89 (Магма)
В арсенале уже есть почти все необходимые понятия, поэтому мы готовы перейти к первой важной теме отечественной криптографии — ГОСТ 28147—89. Стоит сказать, что про этот стандарт не написал еще только ленивый, поэтому я попробую в миллион первый раз кратко и без тучи формул изложить суть режимов шифрования великой и ужасной Магмы. Если решишь почитать сам стандарт, то стоит запастись временем, силами, терпением и едой, потому что стандарты на человеческом языке, как известно, писать строго запрещено.
Основные характеристики: ключ 256 бит, блок 64 бита.
Перед разбором Магмы необходимо усвоить новое понятие — таблицы замены, или S-боксы. Это таблица того же вида, что и таблица в шифре замены. Предназначена для замены символов подблока на символы, зафиксированные в таблице. Не стоит думать, что S-бокс — это случайные цифры, сгенерированные функцией rand()
. S-боксы представляют собой результат продуманных сгенерированных последовательностей, ведь на них держится криптостойкость всего шифра.
ГОСТ 28147 весьма скупо характеризует свои узлы. Говорится лишь о том, что они являются дополнительным секретным элементом (наряду с секретным ключом) и «поставляются в установленном порядке». Больше ничего. С момента принятия ГОСТ 28147 научно-техническая неопределенность, связанная с выбором S-боксов, порождала слухи и домыслы. Ходили разговоры о секретных критериях, известных только разработчикам ГОСТа. Естественно, что эта неопределенность снижала доверие к криптосистеме.
Этот недостаток дал отличную почву для критики стандарта. Французский криптограф Николя Куртуа опубликовал несколько статей, содержащих ряд спорных положений относительно стойкости ГОСТа. Куртуа считает, что на российский стандарт легко построить атаку и его никак нельзя причислять к международным. Однако свой анализ Куртуа проводит для S-боксов, отличных от действующих, так что не стоит полагаться на его мнение.
А теперь посмотрим, что же напридумывали в стенах мрачной Лубянки.
Режим простой замены
В режиме простой замены на 32 раунда, согласно стандарту, нам нужно 32 раундовых ключа. Для генерации раундовых ключей исходный 256-битный ключ разбивается на восемь 32-битных блоков: K1...K8
. Ключи K9...K24
являются циклическим повторением ключей K1...K8
. Ключи K25...K32
являются ключами K8...K1
.
- Каждый блок 64 бита делится на два подблока — Ai и Bi.
- Левый подблок Ai складывается по модулю 232 с раундовым ключом K1:
Ai+1 = Ai + Kimod232
. - Левый подблок проходит через S-бокс.
- Биты левого подблока сдвигаются на 11 позиций (циклический сдвиг).
- Левый подблок складывается с правым по модулю 2:
Ai = Ai⊕Bi
. - Правый подблок принимает первоначальное значение левого подблока:
Bi+1 = Ai
. - Подблоки меняются местами.
Сразу пример одного раунда. Ключ 256 бит:
arvadek adava arvadek adava arvadek adava arvadek adava arva
00011 01010 11110 00011 01001 00001 01111 00011 01001 00011 11110 00011… …00011 01010 11110 0
Тогда раундовые ключи
K1 = 00011 01010 11110 00011 01001 00001 01
K2 = 111 00011 01001 00011 11110 00011 0001
K3 = …
S-бокс = [1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12]
Как пользоваться таким S-боксом? Очень просто! Если на входе S-бокса 0, то на выходе будет 1 (берем 0-й символ S-бокса), если 4, то на выходе будет 5 (берем 4-й символ), если на входе 7, то на выходе 4, и так далее.
Открытый текст:
avada kedavra a
00011 11110 00011 01001 00011 01111 00001 01001 00011 11110 01010 00011 00011
Входной блок 64 бита
00011 11110 00011 01001 00011 01111 00001 01001 00011 11110 01010 00011 0001
Делится на два 32-битных блока старших и младших битов:
Пример, конечно, вышел дикий, потому что ГОСТ — это все-таки не такой стандарт, чтоб каждый мог его ручками перебирать.
Режим простой замены чересчур простой и имеет существенные недостатки:
- одна ошибка в шифрованном блоке искажает все биты этого блока;
- при шифровании одинаковых блоков открытого текста получаются одинаковые блоки шифротекста, что может дать определенную информацию криптоаналитику.
Таким образом, применять ГОСТ 28147—89 в режиме простой замены желательно лишь для шифрования ключевых данных.
Режим гаммирования
Недостатков режима простой замены этот режим не имеет. Режим гаммирования называется так потому, что в нем используется гамма — псевдослучайная последовательность, которая в каждом раунде складывается по модулю 2 с открытым текстом. Гамма образуется из синхропосылки S — псевдослучайной последовательности, которая изменяется с каждой итерацией и проходит шифрование в режиме простой замены, после чего превращается в гамму и накладывается на открытый текст.
А теперь все по порядку.
- Итак, пусть у нас есть синхропосылка S — 64-битная псевдослучайная последовательность.
- S прошла через режим простой замены, при этом разбившись на два подблока — S0 и S1.
- Подблоки складываются с фиксированными константами:
S0 = S0 + C0mod232
S1 = S1 + C1 - 1mod(232-1) + 1 - Подблоки S0 и S1 снова проходят режим простой замены, сращиваются, и получается результирующая гамма
Ω = S0VS1
. - Открытый текст складывается по модулю 2 с полученной гаммой.
Шаги 3–5 повторяются для каждого блока. Все эти манипуляции можно посмотреть на схеме.
Расшифрование выполняется аналогично, вместо блока открытого текста подается блок шифротекста.
Режим гаммирования с обратной связью
Идем на усложнение. Алгоритм похож на режим гаммирования, однако гамма формируется на основе предыдущего блока зашифрованных данных, так что результат шифрования текущего блока зависит также и от предыдущих блоков.
- Синхропосылка S — 64-битная псевдослучайная последовательность.
- S шифруется в режиме простой замены.
- Открытый текст складывается по модулю 2 с полученной гаммой.
- Полученный шифротекст поступает в качестве синхропосылки для следующего блока, а также поступает на выход.
Как это выглядит, можно посмотреть на схеме.
Режим имитовставки
В этом режиме вырабатывается имитовставка — дополнительный блок фиксированной длины, зависящий от исходного текста и ключей. Такой небольшой блок нужен для подтверждения того, что в шифротекст случайно или преднамеренно не были внесены искажения, — то есть для проверки целостности. Работает этот режим так:
- Блок открытого текста проходит 16 раундов в режиме простой замены.
- К полученному блоку по модулю 2 прибавляется еще один блок открытого текста.
- Сумма проходит еще 16 раундов в режиме простой замены.
- Прибавляется следующий блок открытого текста и опять простая замена и так далее, пока не кончатся блоки открытого текста.
Для проверки получатель после расшифровывания текста проводит аналогичную описанной процедуру. В случае несовпадения результата с переданной имитовставкой все соответствующие M блоков считаются ложными.
ГОСТ 34.12—2015 (Кузнечик)
Многие считают ГОСТ 28147—89 морально устаревшим и недостаточно стойким по сравнению с зарубежными алгоритмами. На смену ему отечественными криптографами был выпущен новый стандарт шифрования. Говорят, что это произошло то ли из-за большого количества атак на старый ГОСТ, то ли потому, что такая длина блока уже устарела и маловата для современных массивов данных. Истинных причин никто не афиширует. Конечно, не обошлось без изменений основных характеристик.
Основные характеристики: ключ 256 бит, блок 128 бит.
Также стоит сказать, что в новом стандарте S-боксы фиксированы и продуманны, так что не стоит изобретать свои чудо-случайные подстановки. В новом ГОСТе режимов шифрования стало гораздо больше:
- режим простой замены (Electronic Codebook, ЕСВ);
- режим гаммирования (Counter, CTR);
- режим гаммирования с обратной связью по выходу (Output Feedback, OFB);
- режим простой замены с зацеплением (Cipher Block Chaining, СВС);
- режим гаммирования с обратной связью по шифротексту (Cipher Feedback, CFB);
- режим выработки имитовставки (Message Authentication Code algorithm).
Рассмотрим новые режимы.
Режим простой замены с зацеплением
Как было видно на прошлом стандарте, режим простой замены — самый слабенький из режимов, поэтому в новом стандарте он теперь выступает с зацеплением и стал вовсе не таким простым.
- Инициализирующий вектор — звучит страшно, но на деле всего лишь последовательность битов, поступающая на вход.
- Вектор разбивается на две части — L и R, одна из которых складывается по модулю 2 с открытым текстом, а другая становится половинкой инициализирующего вектора для следующего блока.
- Сумма открытого текста и кусочка инициализирующего вектора проходит через шифр простой замены.
- Полученные блоки зашифрованного текста склеиваются.
Стоит посмотреть на схему, и сразу все становится ясно.
Разумеется, с инициализирующим вектором не все так просто: он проходит через ряд линейных преобразований (с использованием линейного регистра сдвига), прежде чем начать шифрование нового блока. Но для знакомства с шифром достаточно представлять такую схему. Расшифрование в этом режиме тоже не совсем очевидное, поэтому лучше посмотреть схему.
Вместо блока открытого текста подается блок расшифрованного шифротекста.
Режим гаммирования с обратной связью по выходу
Завершающий эту статью режим очень похож на предыдущий с существенным различием: сцепление идет до сложения с открытым текстом.
Расшифрование в этом режиме выполняется аналогично зашифрованию, только блоки открытого текста заменяются блоками шифротекста.
Где же оно все-таки надо?
В нашей стране ГОСТ 28147—89 активно применяется в системах шифрования (спасибо, кэп!). Шифрование на отечественном стандарте предусматривает наиболее используемое отечественное ПО в области криптографии: Acronis, КРИПТО-ПРО и другие. Кроме того, ты сам можешь использовать ГОСТ в своих разработках — ты имеешь на это право, можно даже считать, что своими налогами ты оплатил этот стандарт. Для многих языков программирования существуют библиотеки, его реализующие. Например, для Java и C# есть Bouncy Castle, на JS — библиотека WebCrypto GOST Library, для плюсов — Encryptions. Среди отечественных разработок это криптопровайдер КриптоПро CSP.
Пара слов о стойкости режимов шифрования. Немало зарубежных криптографов пытались поднять руку на наш стандарт, однако на данный момент не известно ни одной атаки, которая может быть реализована на современном технологическом уровне развития. Среди программистов этот стандарт долгое время был не слишком популярен, так как из его текста понять алгоритм работы тяжело, а более четких описаний маловато. Но сейчас уже полно реализаций на многих языках программирования. Так что теперь использование ГОСТа вполне реально, и по многим параметрам он превосходит зарубежные стандарты. В конце концов, где же патриотизмъ?!
В следующей статье поглядим, что они там понаделали в своей загранице.