Глава 5. Блочные шифры

5.1. Введение и классификация

Блочные шифры являются основой современной криптографии. Многие криптографические примитивы – криптографически стойкие генераторы псевдослучайной последовательности (см. главу 6.3), криптографические функции хеширования (см. главу 8) – так или иначе основаны на блочных шифрах. А использование медленной криптографии с открытым ключом было бы невозможно по практическим соображениям без быстрых блочных шифров.

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

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

с использованием некоторого ключа, а также соответствующую ей функцию расшифрования:

$$\begin{array}{l} C = E_K\left( M \right), \\ M'= D_K\left( C \right). \end{array}$$

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

$$ \forall k \in {\mathbb{K}}, m \in {\mathbb{M}} \hookrightarrow D_k \left( E_k\left( m \right) \right) = m. $$

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

Если размер ключа достаточно большой (от 128 бит и выше), то функцию блочного шифрования, удовлетворяющую указанным выше условиям, можно называть надёжной.

Блочные шифры делят на два больших класса по методу построения.

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

Рис. 5.1 — Общая структура раундового блочного шифра. С помощью функции ключевого расписания из ключа $K$ получается набор раундовых ключей $K1, K2, \dots$. Открытый текст $M$ разбивается на блоки $M1, M2, \dots$, каждый из которых проходит несколько раундов шифрования, используя соответствующие раундовые ключи. Результаты последних раундов шифрования каждого из блоков объединяются в шифртекст $C$ с помощью одного из режимов сцепления блоков

Аргументами каждого раунда являются результаты предыдущего раунда (для первого – часть открытого текста) и раундовый ключ. Раундовые ключи получаются из оригинального ключа шифрования с помощью процедуры, получившей название алгоритма ключевого расписания (также встречаются названия «расписание ключей», «процедура расширения ключа» и др.; англ. key schedule). Функция ключевого расписания является важной частью блочного шифра. На потенциальной слабости этой функции основаны такие криптографические атаки, как атака на основе связанных ключей и атака скольжения.

После прохождения всех раундов шифрования блоки $C1$, $C2$, $\dots$ объединяются в шифртекст $C$ с помощью одного из режимов сцепления блоков (см. раздел 5.8). Простейшим примером режима сцепления блоков является режим электронной кодовой книги, когда блоки $C1$, $C2$, $\dots$ просто конкатенируются в шифртекст $C$ без дополнительной обработки.

К числовым характеристикам блочного шифра относят:

Также надёжные блочные шифры обладают лавинным эффектом (англ. avalanche effect): изменение одного бита в блоке открытого текста или ключа приводит к полному изменению соответствующего блока шифртекста.