Шифрование с симметричным ключом используется повсеместно в современном мире - хранение и передача информации, электронная почта, даже просмотр видео на YouTube. Сильные симметричные шифры включают в себя правильно построенные S-блоки. В своей статье я разберу различные способы создания S-блоков и сравню их. S-блок - функция, принимающая на входе n бит, преобразующая их по определённому алгоритму и возвращающая на выходе m бит. S-блоки широко используются в большинстве блочных шифров. Они могут различаться по входным и выходным размерам (n и m), могут создаваться детерминировано или случайно, а также могут быть неизменными (фиксированными) или генерироваться на основе ключа. S-блоки могут быть представлены или в виде таблицы (как в DES), или в качестве алгебраической булевой функции (как в AES). Важными критериями при составлении S-блока являются его нелинейность и критерий распространения булевых функций. Для того, чтобы рассматривать S-блок как последовательность булевых функций, сначала поймём, какое вообще отношение имеют булевы функции к криптографии. В традиционных системах шифрования, переводящих открытое сообщение в зашифрованное с помощью секретного ключа, очень широко используется аппарат булевых функций. Основное требование к ним заключается в том, чтобы они осложнили расшифровку сообщения лицом, не являющимся его адресатом. Для иллюстрации применения булевых функций приведём схему поточного шифрования, когда каждый поступающий символ тут же преобразуется в символ шифртекста. Исходный текст, ключ и шифртекст - бинарные строки одинаковой длины. На практике чаще всего отправитель и получатель выбирают вместо ключа в шифре Вернама псевдослучайную последовательность, которая по оговорённому алгоритму генерируется из короткого секретного ключа. Такая последовательность называется ключевой поток или гамма. Стандартно секретный ключ размножается до гаммы с помощью устройств, называемых регистрами сдвига с линейной обратной связью (Linear Feedback Shift Register, сокращённо LSFR). По К. Шеннону шифрование должно использовать принципы рассеивания (распространение влияния одного знака открытого текста на много знаков шифртекста и одного элемента ключа на много знаков шифртекста) и запутывания (усложнения взаимосвязи между элементами данных). Устройство LSFR реализует принцип рассеивания, но не запутывания, поэтому общепринято для запутывания использовать несколько регистров LSFR. Пусть, например, длина секретного ключа равна L. Этот ключ можно разделить между несколькими регистрами длин так, чтобы , и комбинировать выходы всех регистров посредством булевой функции .  Чтобы идти дальше, нужно ввести несколько терминов. Пусть -поле Галуа порядка 2 (или просто набор ), а -размерное векторное пространство над полем . S-блок размерами может быть представлен в качестве отображения: Булева функция аргументов это отображение: Таким образом, S-блок может быть представлен в виде последовательности булевых функций: Пусть для булевой функции  аргументов  целое число  - десятичное представление её аргументов (). Пусть . Обозначим таблицу истинности функции  как  . Булева функция также может быть представлена в виде алгебраической нормальной формы (полинома Жегалкина) с  коэффициентами: где   обозначает суммирование по модулю 2. Булева функция  аргументов называется аффинной, если её можно представить в виде: Как мы убедились, для криптографических целей линейная (аффинная) булева функция не подходит. Именно здесь в игру вступает понятие "нелинейности". Булева функция , не являющаяся аффинной, называется нелинейной булевой функцией. Вес Хэмминга бинарного вектора , обозначаемый как - это количество единиц в этом векторе. Расстояние Хэмминга между двумя булевыми функциями определяется как: Порядок нелинейности (обозначается как  булевой функции - это максимальное количество переменных в произведении с ненулевым коэффициентом , где - подмножество множества . Если - пустое множество, этот коэффициент обозначается как и называется коэффициентом нулевого порядка. - коэффициенты первого порядка, - коэффициенты второго порядка. Число всех коэффициентов АНФ - . Обозначим число всех (нулевых и ненулевых) коэффициентов порядка функции  как . Для функции   аргументов есть столько коэффициентов заданного порядка, сколько есть комбинаций из  элементов в элементном множестве, Расстояние от булевой функции  до множества  булевых функций  аргументов Расстояние от функции  до множества аффинных функций - это расстояние от функции  до ближайшей функции Расстояние от функции  до множества всех аффинных функций называется нелинейностью функции  и обозначается как  Известно, что  Если - чётное, тогда существуют функции с . Эти функции называются бент-функциями. Рассмотрим бент-функции поподробнее. Бент-функция - булева функция с чётным числом переменным, для которой расстояние Хэмминга от множества аффинных булевых функций с тем же числом переменных максимально. Бент-функции в этом смысле обладают максимальной степенью нелинейности среди всех функций с данным числом переменных и благодаря этому широко применяются в криптографии. Для того, чтобы рассмотреть некоторые алгоритмы генерирования бент-функций, введём ещё несколько определений. Пусть - число нулей в таблице истинности  функции , а - число единиц. Булева функция  называется сбалансированной, если . Булева функция  называется идеально нелинейной тогда и только тогда, когда сбалансирована для любого  такого, что . Для идеальной нелинейной булевой функции любое изменение входных данных приводит к изменению выходных данных с вероятностью . Пусть  - множество идеальных нелинейных функций  аргументов с чётным .  Алгоритм 1. Вход: . Выход: бент-функции в множестве  бент-функций 8 аргументов. Метод: функция , определённая как:  Алгоритм 2. Вход: бент-функции  аргументов ,  и  такие, что - бент-функция. Выход: бент-функция   аргументов. Метод:    Большинство известных конструкторов идеальных (или бент-) функций берут на входе идеальные нелинейные функции  аргументов и генерируют идеальные нелинейные функции  аргументов. Большим недостатком этих методов является их детерминированность. Только идеальные нелинейные функции 4 и 6 аргументов выбираются случайно и результирующая функция получается по одной и той же детерминированной формуле каждый раз. Даже если есть какой-то "случайный" элемент в таком генерировании (например, добавочный линейный элемент), это не добавляет никакой новой особенности к сгенерированной функции.  Алгоритм 3. Вход: биективное отображение , функция , - чётное. Выход: бент-функция , называемая функцией Майорана. Метод:  где ,  - конкатенация и  Пусть - перестановка . Функция  где  - функция Майорана, является бент-функцией. Я буду отсылаться к этим функциям как к функциям с переставленными входными данными. Построенные "руками" бент-функции имеют некоторые врождённые особенности, вызванные методикой их создания. Это, очевидно, нежелательно в силу того, что эти особенности могут быть использованы для криптоаналитических атак.  Однако, найти все бент-функции случайным поиском по булевым функциям 6 аргументов невозможно. Здесь может пригодиться представление функции в виде полинома Жегалкина. Работа с ним позволяет контролировать нелинейные характеристики сгенерированных функций. Базовые особенности бент-функций могут быть использованы для того, чтобы существенно сузить область поиска, что делает генерирование бент-функций возможным даже на обычном ПК. Алгоритм генерирования бент-функций в области определения полинома Жегалкина берёт на вход минимальное и максимальное количество коэффициентов каждого порядка, которое итоговая функция может иметь. Так как нелинейный порядок бент-функций меньше или равен  , в полиноме Жегалкина бент-функции не может быть порядка выше . Это ограничение значительно уменьшает область поиска.  Количество коэффициентов степеней меньше или равных  может быть зафиксировано или случайно выбрано внутри допустимого диапазона. Если количество коэффициентов для заданного порядка  зафиксировано, тогда все сгенерированные функции будут иметь такое же количество коэффициентов этого порядка, но сами коэффициенты будут разными в каждой сгенерированной функции. Если количество коэффициентов для заданного порядка  выбрано случайно, тогда все сгенерированные функции будут иметь не только разные коэффициенты, но и разное количество этих коэффициентов порядка . Разумеется, можно зафиксировать количество коэффициентов для некоторых порядков и использовать переменное количество коэффициентов других порядков. Важное преимущество этого подхода - возможность запретить генерировать бент-функции, которые являются линейными преобразованиями других бент-функций. Это легко достигается обнулением количества коэффициентов нулевого и первого порядков. Поэтому в полиномах Жегалкина итоговых функций не будет линейной части. Бент-функции любых порядков могут быть сгенерированы этим методом (обнулением любых коэффициентов больших порядков). Недостатком этого метода является отсутствие гарантии генерирования бент-функций без повторений, хотя шанс сгенерировать две идентичные бент-функции минимален. Однако, если есть задача избегать повторений, множество сгенерированных бент-функций должно быть проверено на наличие дубликатов. Также у этого подхода есть свои ограничения. Во-первых, количество возможных функций растёт вместе с числом коэффициентов высших порядков  и генерирование бент-функции становится невыполнимым. Поэтому алгоритм хорошо работает с небольшим количеством коэффициентов высших порядков (например, менее 6 для ). Во-вторых, этот метод не генерирует все возможные бент-функции с равными вероятностями.   Алгоритм 4. (случайно сгенерированные бент-функции) Вход:    - число аргументов ( - чётное) для каждого порядка  такого, что  определим минимальное  и максимальное  количество коэффициентов полинома Жегалкина,  Выход: Повторять шаги (1.1) и (1.2) для каждого порядка  такого, что : -случайно сгенерированная идеальная нелинейная функция   в представлении полинома Жегалкина случайно сгенерированная идеальная нелинейная функция  в форме таблицы истинности. Метод: Повторять шаги (1.1) и (1.2) для каждого порядка  такого, что : 1.1 генерировать случайное количество коэффициентов  полинома Жегалкина для заданного порядка такого, что , 1.2 для полинома Жегалкина зафиксировать случайно значение 1 для коэффициентов порядка . Преобразовать к . Вычислить расстояние от до множества аффинных функций. Если расстояние, вычисленное в шаге (3), равно , тогда  и  - бент-функции, останавливаемся; иначе идём к (1).  Если  не задано, алгоритм 4 может быть использован даже для нечётного числа аргументов. Получившиеся функции не будут являться бент-функциями (т.к бент-функции не существуют для нечётного числа аргументов), поэтому шаг (4) алгоритма не выполняется - алгоритм должен выполняться в цикле, генерирующем случайные функции, многие из которых нелинейные. Нелинейность S-блока - функции такой, что , вычисляется как минимальная нелинейность всех линейных комбинаций функций, являющихся компонентами . То есть, Чтобы посчитать нелинейность одного S-блока, нужно построить  линейных комбинаций и посчитать их расстояния до аффинных функций. Наименьшая из посчитанных нелинейностей и будет нелинейностью S-блока. На графиках ниже изображены графики распределения нелинейностей S-блоков, построенных из шести 8-аргументных функций. График 1. Зависимость числа S-блоков, построенных из случайных булевых функций, от их нелинейности График 2. Зависимость числа S-блоков, построенных из случайных сбалансированных булевых функций, от их нелинейности Сравнивая графики 1 и 2, можем заметить, что сбалансированные булевы функции лучше для построения S-блоков, чем чисто случайные булевы функции, так как они создают больше S-блоков относительно высокой нелинейности (98 и 100). График 3. Зависимость числа S-блоков, построенных из сконструированных булевых функций, от их нелинейности Немного лучше, чем S-блоки из случайных сбалансированных булевых функций, справляются S-блоки из сконструированных бент-функций (Алгоритм 2) (см. График 3). Только при высокой нелинейности, равной 98, немного больше S-блоков строится с использованием сконструированных функций.  График 4. Зависимость числа S-блоков, построенных из случайно сгенерированных бент-функций, от их нелинейности Другое распределение нелинейности характеризует S-блоки, построенные из случайно сгенерированных бент-функций (см. График 4). В этой группе существуют S-блоки наибольшей нелинейности 112, их около  (их не видно на графике, так там наибольшее значение 104). Также здесь примерно в 20 раз больше S-блоков очень высокой нелинейности 100, чем в случае S-блоков, построенных из сконструированных бент-функций или из случайных сбалансированных функций. Это означает, что использование случайно сгенерированных бент-функций может привести к конструированию S-блоков с лучшими криптографическими качествами за короткое время. Однако, нужно отметить, что в случае случайно сгенерированных бент-функций есть также S-блоки относительно слабой нелинейности (80, например). Поэтому построение S-блоков из этих функций требует (больше, чем в других случаях) осторожной проверки полученных S-блоков на возможную слабую нелинейность. Итак, мы изучили роль S-блоков в криптографии и рассмотрели несколько различных методов их создания. Они действительно используются повсеместно и в отечественных, и в зарубежных шифрах, поэтому вопрос надёжности их шифрования является ключевым. Лучшими криптографическими свойствами обладают S-блоки, построенные на основе случайно сгенерированных бент-функций.  И. Агафонова - Криптографические свойства нелинейных булевых функций Anna Grocholewska-Czurylo and Janusz Stoklosa - Random Generation of S-Boxes for Block Ciphers Meier, W., Staffelbach, O - Nonlinearity criteria for cryptographic functions Википедия - S-блок(информатика) Wikipedia - S-box Wikipedia - Bent functions