Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическая криптография алгоритмы и их программирование
.pdf
Глава 4. Как устроены современные шифры 71
вало значительные изменения выхода шифра, то есть шифротекста. Такой шифр
совершенно очевидно даст криптоаналитику гораздо меньше возможности исследовать взаимосвязи между участками открытого и зашифрованного текстов, чем
не обладающий таким свойством. Само же свойство обычно называют свойством
лавинного эффекта (avalanche) или просто лавинным эффектом.
Создать хороший алгоритм с лавинным эффектом не так-то просто, как может показаться. И главным образом из-за того, что существует необходимость в
детерминированности всех операций шифра, ведь иначе невозможно будет построить обратное отображение и, следовательно, расшифровать текст даже уполномоченному на то получателю.
Строго говоря, чтобы добиться хорошего лавинного эффекта, используют
методы рассеивания (diffusion) информации. Шеннон, например, под рассеиваниемпонимал некоторое абстрактное преобразование, при котором изменение
одного бита значения аргумента влекло бы за собой изменение почти всех битов значения результата преобразования, то есть при изменении одного бита
значения аргумента должно повлечь за собой изменение каждого из битов ре-
зультата с вероятностью, близкой к или равной
1
для каждого из битов выхо-
2
да. Это дает математическое обоснование стойкости шифра к анализу: не имея
преимуществ при расстановке вероятностей изменения какого-то конкретного
бита перед всеми остальными битами, криптоаналитик также не сможет извлечь никакой полезной информации и из статистического анализа выхода шифра (напомним читателю, что примитивный подсчет частот или использование
марковской модели текста — это простые разновидности анализа статистических свойств шифра).
Шеннон, видимо, сознательно отошел от проблемы конкретной реализации,
предоставив описание свойства на суд криптографической общественности и его
реализацию наиболее изобретательным из них. Наиболее удачливым криптографом, первым предложившим элегантный и практичный способ организации свойства рассеивания, оказался Хорст Файстель, работавший с Шенноном на протяжении длительного времени.
Вторая задача построения стойких шифров заключается в необходимости создания полной зависимости каждого бита результата криптографического преобразования, иными словами, все того же выхода шифра, от всех битов исходного
открытого текста. Видимо, поэтому такое свойство для шифра назвали свойст-
вом полноты. Вкупе со свойством рассеивания полнота дает шифру тотальную
зависимость от ключа и открытого текста. Полнота шифра зависит от его перемешивающих свойств, наследуемых с полным правом от свойства перемешивания
(confusion), осуществляющего зависимость преобразования данных от ключевой
информации.
Собственно говоря, в строгой трактовке полнота шифра описывается следующим условием, в котором для каждого бита i выхода шифра и произвольного бита
j открытого текста существуют два различных открытых текста, отличающихся
только в этом произвольном бите i, но имеющих один и тот же выход, за исключением бита j.

72 Глава 4. Как устроены современные шифры
Надо заметить, что в ряде случаев от криптографической функции требуется
полнота только для открытого текста, как, например, в отечественном стандарте
шифрования, где ключ гаммируется с открытым текстом перед шифрованием. Некоторые же криптографические примитивы строятся как зависимые от ключевой
последовательности преобразования. В таком случае они должны иметь свойство
полноты для всех или почти всех возможных значений ключа.
Конечно, полноты и рассеивания просто не может быть в листингах 4.1 и
4.2, поскольку функции шифрования там зависят не только от ключа, но и от открытого текста. Но в реализации настоящих шифровальных алгоритмов эти функции присутствуют. Что именно дает присутствие обоих этих свойств у шифра?
Обе задачи схожи между собой. Они лишь представляют разные подходы к одной общей большой задаче. Отсюда и зеркальность свойств рассеивания и полноты. Кроме того что рассеивание очень сильно затрудняет поиск зависимостей
между битами исходного и шифротекста, идеальное рассеивание также играет
роль функции, распределяющей ключи равномерно по всему ключевому пространству. Это значительно затрудняет поиск ключей-близнецов или, как их еще
называют, эквивалентных ключей, то есть ключей, для которых зашифрование
одного и того же открытого текста даст тот же самый шифротекст.
14
А это
усложняет некоторые универсальные криптоатаки (о них мы поговорим несколько позже в разделе, посвященном криптоанализу) на блочные шифры. Полнота
защищает от возможности криптоаналитику получить дополнительную информацию о связях внутри шифра и его зависимости от ключа. Таким образом, мы отрезаем ему все пути атаки.
Считается, что, поскольку обе указанные проблемы криптографии (то есть
проблемы построения и обоснования верности построения функций, реализующих рассеивание и являющихся полными) симметричных шифров были описаны
впервые самим Шенноном, он также достиг и наилучших теоретических результатов на некоторое время после этого. А вот что касается практической реализации, то ее эффективная версия появилась далеко не сразу — только в середине
60-х годов была впервые опубликована надежная схема, реализующая оба этих
основных свойства.
Тем не менее сам Шеннон, по-видимому занявшись изучением влияния различных преобразований текстов на их энтропию, выделил из общей массы различных линейных и нелинейных способов модификации текстов два класса.
Именно с их помощью он хотел добиться преобразования рассеивания и преобразования перемешивания. Да и c теоретической точки зрения криптографические
полные функции рассеивания исследованы еще не полностью. Многие результаты зачастую дает практика, для которой теоретическое обоснование находится
весьма тяжело. Впрочем, существует очень много технических способов реализации вполне приемлемых криптографических примитивов.
14
Один и тот же шифротекст из-за однозначности расшифрования всегда даст один и тот
же открытый текст. Но в случае, когда существуют эквивалентные ключи, дешифровать шиф
ровку во многих случаях будет проще. Ведь вместо того чтобы найти какой-то один-единствен
ный ключ, криптоаналитик сможет найти любой из двух, трех и т. д. эквивалентных ключей.
-
-

Глава 4. Как устроены современные шифры 73
Единственным ощутимым минусом шенноновского принципа композиционных сложных шифров является необходимость того, чтобы все простейшие функции шифрования в большом «бутерброде» из их множества были обратимы. Иначе, зашифровав текст, мы не сможем найти способ его не то что дешифровать, но
и расшифровать. Для программирования шифров это также представляет некоторые неудобства — ведь теперь, кроме функции зашифрования, требуется реализовать адекватную функцию расшифрования.
Снова обращаясь к листингам 4.1 и 4.2, можно заметить, что функция F() является тождественной к своей обратной, то есть зашифровывать и расшифровывать можно, используя только функцию F(), и ничего более. Что весьма удобно,
не правда ли?
А вот для функции S() такого не наблюдается. Следовательно, придется написать дополнительную функцию расшифрования S_back(), а это означает, что
точно так же надо будет написать еще и функции расшифрования sum_of_F_S(),
other_sum_of_F_S(), mul_of_F_S() и все функции, которые используют S(). Учитывая необходимость проверки корректности реализации алгоритма и всевозможные длительные тесты, которые придется делать для увеличившегося в два и более раз исходного текста программы, необходимость наличия обратного преобразования может показаться чрезвычайно неудобной. Хотя в каком-то конкретном
случае это может быть и не так.
Например, современный блочный шифр 3-WAY создан именно на основе применения обратимых преобразований. В качестве размера блока в нем выбрано
значение, равное 96 битам. Зашифрование каждого блока происходит за 11 раундов, в течение которых данные подвергаются множеству прямых преобразований
с помощью простых функций.
В качестве таких функций было выбрано пять преобразований, включающих
в себя:
•
простую перестановку бит в обратном порядке;
•
перестановку, зависящую от ключа;
•
функцию замены для 3-битовых векторов;
•
два типа вспомогательных перестановок, зависящих от ключа;
•
специальную линейную функцию, использующую арифметику поля Галуа
характеристики 2.
Но самым простым в работе шифра представляется алгоритм выработки итерационных подключей. В силу устройства архитектуры шифра размер ключа равен размеру блока — 96 битов, а подключи имеют тот же размер, что и главный
ключ. Они вычисляются путем прибавления некоторой константы — двоичного
вектора, содержащего относительно небольшое количество единиц.
Расшифрование шифротекста происходит аналогично, за исключением того,
что все преобразования берутся обратными и их порядок применения ставится
обратным к порядку зашифрования.
Кстати, автор этого алгоритма Йоан Дэмен (Joan Daemen) фигурирует в анналах криптографии так же, как соавтор блочного шифра SQUARE, который стал
прототипом для AES — нового стандарта шифрования США.

74 Глава 4. Как устроены современные шифры
Сеть Файстеля
В начале 1970-х годов, сознавая необходимость защиты уже электронной информации при передаче данных в сетях ЭВМ (особенно бизнес-транзакций, при
осуществлении денежных переводов и передаче конфиденциальных финансовых
данных), компания International Business Machines (она же известная во всем
мире как IBM) приступила к выполнению собственной программы научных исследований, посвященных защите информации в электронных сетях, в том числе и
криптографии. Так развитие одной передовой технологии повлекло за собой настоящую революцию в другой.
Поскольку в ряде университетов Соединенных Штатов (таких, как Станфордский университет и Массачусетский технологический институт) всегда существовал интерес к данной области исследования, IBM постаралась привлечь университетских специалистов к разработке методов защиты электронной информации.
Это было отчасти вызвано и тем, что многие из специалистов этих университов
активно сотрудничали с военными кругами и соответственно специалистами военной разведки — основными потребителями криптографических методов сокрытия и защиты информации. Поэтому университетские криптографы обладали несколько большими объемами информации о защите информации, нежели другие
профессиональные математики и аналитики. Ведь военные специалисты в то время были единственными источниками достойной научной информации, посвященной криптографии, хорошо знавшими криптографию не только с теоретической,
но и практической стороны.
Команду разработчиков фирмы IBM, приступившую к исследованию систем
шифрования с симметричной схемой использования ключей, возглавил доктор
Хорст Файстель, в то время уже ставший довольно известным криптографом.
Файстель до того момента уже успел тесно поработать с Клодом Шенноном в
компании Bell Laboratories. Идеи Шеннона вдохновляли многих исследователей
на оригинальные изобретения. Свидетельством тому является довольно большое
количество патентов, зарегистрированных и принятых в середине 60-х годов Национальным патентным бюро США (United States Patent and Trademark Office).
Файстель активно сотрудничал с Шенноном и не мог не заразиться его идеями.
На его счету как минимум два патента и несколько революционных статей в области криптографии и криптоанализа.
Воплотить большую часть из своих идей в жизнь он смог с помощью возможностей, предоставленных ему компанией IBM, не жалевшей денег и специалистов
на разработку новых методов защиты электронной информации. Передовая технология требовала инвестиций и отнюдь не гарантировала быстрой отдачи, требовалось время на разработку действительно эффективных средств защиты электронного документооборота — эффективной и стойкой к взлому шифросистемы и
методов ее использования. Представители руководства IBM понимали это и в достаточной степени предоставили свободу разработчикам, поставив перед ними в
общем-то нелегкую и нетривиальную задачу.
Надо признать, что результат оправдал ожидания. Им стала проведенная в
исследовательской лаборатории IBM Watson Research Lab разработка новой ори
-

Глава 4. Как устроены современные шифры 75
гинальной архитектуры построения симметричных шифров на базе необратимых
преобразований. Архитектура нового способа шифрования впоследствии была названа в классической литературе архитектурой Файстеля (на данный момент в
русской и зарубежной криптографии существует более устоявшийся термин: сеть
Файстеля или Feistel's network). Позднее, в соответствии с разработанными Хорстом принципами, был сконструирован шифр Люцифер (Lucifer) — первый серьезный блочный шифр, описание которого появилось в открытой литературе и вызвало новую волну интереса специалистов к криптографии в целом.
Построение сложных криптографически стойких, но обратимых преобразований представляет собой довольно трудоемкую задачу. Кроме того, практическая
реализация обратимых преобразований обычно содержит неэффективные алгоритмы, что приличным образом сказывается на скорости шифрования. По этой
причине Файстель решил не искать решение проблемы обратимого преобразования данных, а попытаться найти схему шифрования, в которой такие преобразования не участвовали бы вовсе.
Идея использования операции «исключающее ИЛИ» возникла из классических примеров систем шифрования, а именно из идеи использовать самый простой с технической точки зрения способ шифрования — гаммирование. Стойкость такого способа, как известно, зависит от свойств вырабатываемой гаммы.
Следовательно, процесс выработки гаммы — двоичной последовательности, которую затем суммируют с открытым текстом, — является самым узким местом во
всем способе.
Файстель разрешил проблему следующим образом. Изначально выбирается
размер блока данных, который будет зашифрован за одну итерацию алгоритма
шифрования. Обычно размер блока фиксирован и не изменяется во время работы
алгоритма над открытым текстом. Выбрав достаточно большого размера блок данных, его делят, например, пополам и затем работают с каждой из половинок. Если
размер левой половинки равен размеру правой, такую архитектуру называют
классической или сбалансированной сетью Файстеля. Если же деление блока
данных происходит не на равные части, то такой алгоритм называют разбалансированной сетью Файстеля.
Предложенная им схема шифрования легко может быть продемонстрирована
с помощью схемы шифрования (рис. 4.1).
На изображенной схеме буквами L
è Riобозначены левая и правая половин-
i
ки исходных данных на i-м шаге последовательного преобразования. Каждый такой целый шаг называют раундом шифрования. Функция гаммирования обозначена через F
, поскольку на каждом раунде может быть использована своя собствен-
i
ная функция. Ключ также имеет индекс i, но уже в силу того, что исходный ключ
k может быть преобразован некоторым образом (говорят, развернут) в последова-
тельность итерационных ключей либо подключей, то есть ключей, которые используются непосредственно функцией гаммирования.
Как видно из схемы, сначала с помощью функции гаммирования вырабатывают гамма-последовательность, которая зависит от итерационного ключа k
è ïðà-
i
вой половины данных. После этого левая половинка просто суммируется с полученной гаммой по модулю, например, 2. Затем левая и правая половинки меняют
-

76 Глава 4. Как устроены современные шифры
Ðèñ. 4.1. Архитектура сети Файстеля
ся местами. На этом один цикл шифрования заканчивается. Поскольку за один
раз обрабатывается только одна половина данных, желательно, чтобы число раундов было кратно двум. В таком случае есть уверенность, что каждая из половинок
будет обработана одинаковое число раз. На схеме рис. 4.2 отображена сеть Файстеля с четным числом раундов.
Исходя из данного описания, преобразование данных одного раунда можно
представить с помощью двух формул, выражающих новые значения левой и правой половинок блока шифруемых данных:
LR
=
ii
+
RLFRk
ii ii
+
,
1
=⊕
1
(, ).
Архитектура разбалансированной сети Файстеля выглядит весьма похоже на
архитектуру обычной сети и определяется таким же способом. Единственное, но
весьма существенное отличие состоит в том, что, поскольку используется разбиение не на равные половинки блока, а на участки различной длины, функция гаммирования, обозначенная буквой «F», может зависеть не от всех битов исходного
блока данных или иметь разные зависимости в разных раундах.
Собственно говоря, разбалансированную сеть Файстеля можно рассматривать как обобщение понятия сети Файстеля. Стойкость криптосистемы, построенной на основе сети Файстеля, зависит целиком от результата исполнения нелинейной функции гаммирования в нескольких итерациях. Поэтому для обеспечения достаточной надежности данные должны быть преобразованы с достаточно
большим числом раундов, что позволяет достичь требуемых свойств рассеивания
и полноты и соответственно стойкости шифра к дифференциальному и линейному
криптоанализу (см. раздел «Современные методы криптоанализа»).
В большинстве шифров с архитектурой сети Файстеля используемая функция F в течение каждого раунда зависит только от одного из подключей, вырабатываемых из основного ключа шифра. Это свойство на самом деле не является
основополагающим или положительно влияющим на стойкость шифра — в шиф
-

Глава 4. Как устроены современные шифры 77
Ðèñ. 4.2. Сеть Файстеля с несколькими раундами
ре Khufru, например, параметры функции F изменяются после зашифрования
каждого следующего символа. Сеть с такого рода зависимостью функции гаммирования называют гетерогенной и гомогенной в противном случае. Применение
гетерогенных сетей может значительно улучшить характеристики шифра, поскольку неравномерное изменение внутренних свойств сети в пределах допустимых
границ делает изучение свойств шифра достаточно затруднительным занятием.
Меняя размеры половинок и их влияние на выход шифра, можно добиться впечатляющих статистических результатов, поскольку существует очевидная зависимость не только между сложностью функции гаммирования, но и структурой
используемой сети Файстеля.

78 Глава 4. Как устроены современные шифры
Ðèñ. 4.3. Архитектура разбалансированной сети Файстеля
Целью построения блочных шифров является не только создание стойкого
алгоритма защиты информации, но и такого, чтобы его реализация была достаточно дешевой, а время работы как можно более меньшим. Именно поэтому, легко
реализуемые шифры на базе гомогенных сбалансированных сетей Файстеля применяются гораздо чаще и считаются своего рода «панацеей». Однако это вовсе не
означает, что они являются более криптостойкими и надежными.
Естественным путем увеличения сложности анализа сетей Файстеля является следующий метод (кстати, использованный и в алгоритме в соответствии с
ГОСТ 28147—89 — отечественным стандартом криптографического преобразования данных). Для того чтобы распространить влияние функции F в одном раунде
на выход и функцию следующего раунда, к выходному значению F прибавляют по
некоторому модулю значение итерационного подключа для текущего раунда и затем полученное значение подают на вход функции F следующего раунда шифрования. Такой способ организации сети ставит выходы последующих раундов шифров в прямую зависимость от предыдущих, что способствует организации лавинного эффекта и полноты.
Примером практической реализации сбалансированной гомогенной сети
Файстеля может служить следующий исходный текст (cм. листинг 4.3):
Листинг 4.3
uint16_t F_Gamma(uint16_t data_half, uin8_t key) {
// используем какие-либо сложные преобразования
// но желательно такие, чтобы их выполнение было как можно более быстрым
return (data_half ^ ((uint16_t) key * 0xABCD1234);
}
uint32_t Feistel_Network(uint32_t data, uint8_t key, int rounds) {
uint16_t left, right, swap;
left = data & 0xFFFF; // делим данные (размер 32 бита)
right = (data >> 16) & 0xFFFF; // на половинки по 16 битов

Глава 4. Как устроены современные шифры 79
for(inti=0;i<rounds; i++) {
swap = left ^ F_Gamma(right, key); // готовим левую половинку
left = right; // и меняем местами левую и правую
right = swap; // половинки
}
return (left | ((uint32_t) right << 16));
}
Функция Feistel_Network() представляет собой реализацию сети Файстеля с
произвольным числом раундов rounds. Ключ key представляет собой 8-битное
значение, которое используется только как аргумент для передачи его функции
гаммирования F_Gamma(). Обратите на это особое внимание, поскольку, очевидно, здесь таится первый способ оптимизации алгоритма.
Чтобы ускорить исполнение функции Feistel_Network(), мы можем внести
тело функции F_Gamma() внутрь Feistel_Network(), устранив тем самым накладные расходы на передачу параметров и вызов подфункции. Другой очевидный способ ускорить процесс состоит в том, чтобы сделать число раундов постоянным
(например, равным восьми или шестнадцати), а затем избавиться от цикла, расписав все итерации шифра последовательно, одну за другой. Выбор количества раундов объясняется нахождением некоторого своего рода компромисса между малой скоростью шифрования у шифра с большим количеством раундов и простотой
вскрытия шифра с малым их числом. Этот показатель у шифра, построенного на
сети Файстеля, колеблется от 8 до 32 раундов. Впрочем, никто не возбраняет применять и 64, и 128 раундов. Все упирается лишь в вычислительные мощности
компьютерных систем. Единственное ограничение состоит в том, что количество
раундов должно быть четным. В таком случае обе половинки — и левая, и правая — будут обработаны одинаковое число раз и, следовательно, не возникнет ситуации, когда одна половина данных (например, четная), зашифровываемых
16-раундовым алгоритмом, в действительности обработана восемью, а другая всего лишь семью итерациями алгоритма.
Все проделанные модификации для алгоритма с четырьмя раундами показаны
в листинге 4.4. Подобная оптимизация обычно дает прирост производительности
в 5—10 %, а ведь это еще оптимизация не алгоритма, как такового, а примитивная оптимизация его реализации.
Листинг 4.4
uint32_t Feistel_Network_Optimal(uint32_t data, uint8_t key, int rounds) {
uint16_t left, right, swap;
left = data & 0xFFFF; // делим данные на половинки
right = (data >> 16) & 0xFFFF;
swap = left ^ right ^ ((uint16_t) key * 0xABCD1234); // 1-й раунд
left = right;
right = swap;
swap = left ^ right ^ ((uint16_t) key * 0xABCD1234); // 2-й раунд
left = right;
right = swap;

80 Глава 4. Как устроены современные шифры
swap = left ^ right ^ ((uint16_t) key * 0xABCD1234); // 3-й раунд
left = right;
right = swap;
swap = left ^ right ^ ((uint16_t) key * 0xABCD1234); // 4-й раунд
left = right;
right = swap;
return (left | ((uint32_t) right << 16));
}
На сегодняшний день практически отсутствуют системы шифрования, построенные с помощью разбалансированных сетей Файстеля, а все популярные алгоритмы являются с этой точки зрения классическими. Их вид и функции шифрования можно успешно представить себе, исходя из предоставленных в листингах
раздела примеров.
SP-сеть и шифры Файстеля
Способ, которым следует сочетать принципы перемешивания и рассеивания для получения криптографической стойкости, можно описать следующим образом. Мы увидели,
что перестановки общего вида не могут быть реализованы
для больших значений n,
мы должны ограничиваться схемами подстановки, имеющими подходящий размер... мы выбрали n = 4 в системе, разработанной в IBM и названной Lucifer. Хотя это может показаться слишком маленьким числом, такая подстановка
может оказаться вполне эффективной, если ключ подстановки... выбран верно.
15
скажем для n = 128, и поэтому
Х. Файстель. Криптография
и компьютерная безопасность
Как уже было отмечено, в отличие от шенноновской модели построения шифров, использование сети Файстеля в качестве архитектурной основы шифра позволяет избежать необходимости того, чтобы используемые преобразования были
обратимы. Более того, их необратимость — требование, причем весьма разумное
требование, которым следует пользоваться при выборе соответствующих криптографических примитивов. Тем не менее сам шифр, естественно, должен иметь
обратное преобразование. Можно сказать, что сеть Файстеля — это не что иное,
как способ построения обратимого шифра с блоком размера 2N из необратимых
преобразований, оперирующих с блоками размера N.
В основном в качестве необратимого преобразования для шифра выбирают
некоторую функцию, которая не имеет линейной зависимости значений результата от значений аргумента (подробнее о конкретных реализациях см. далее и в разделе «Свойства S-блоков и их анализ. P-блоки»). Это означает, что функцию не-
15
То есть количества переставляемых значений.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
