% Лекция 18 (17.02.23) \subsection{DES} В 1973--1974 гг. Национальное бюро стандартов США объявило открытый конкурс на создание общедоступного алгоритма шифрования с гарантированной надёжностью. Оценку представленных кандидатов осуществляло Агентство Национальной Безопасности США. В январе 1977 года предложенный фирмой IBM и оказавшийся победителем конкурса <<Алгоритм шифрования для защиты данных ЭВМ>> был зарегистрирован в качестве государственного стандарта США: Data Encryption Standard (Стандарт шифрования данных, DES). Сразу же после создания DES были созданы чипы для быстрого аппаратного шифрования. Вся структура DES была полностью опубликована при его введении в качестве стандарта. Создание шифра DES была полностью опубликована при его введении в качестве стандарта. Создание шифра DES (главным идеологом проекта был Х. Фейстель (1915--1990)) явилось выдающимся научно-техническим достижением, оказавшим глубокое влияние на дальнейшее развитие криптографии и на её использование в интересах широких деловых кругов. Достоинства: простота ключевой системы, высокая скорость аппаратной и программной реализации, достаточно высокая криптографическая стойкость алгоритма шифрования при заданной длине ключа. Алгоритм DES является блочным шифром. Открытый текст, представленный в двоичном виде, разбивается на блоки длины 64 бита, которые переводятся в такой же длины блоки криптограммы с помощью чередования перестановочных и подстановочных шифров. Обозначения: \begin{itemize} \item $L_i$, $R_i$ --- левая и правая половины 64-битного блока $L_i R_i$; \item $\oplus$ --- операция побитового сложения вектор-блоков по модулю 2; \item $k_i$ --- 48-битовые ключи; \item $f$ --- функции шифрования; \item $IP$ --- начальная перестановка степени 64. \end{itemize} \begin{remark} Все приводимые таблицы являются стандартными и должны использоваться при реализации алгоритма DES в неизменном виде. Все перестановки и коды в таблицах подобраны разработчиками таким образом, чтобы максимально затруднить процесс вскрытия шифра путём подбора ключа. \end{remark} \begin{enumerate} \item При зашифровании очередного блока $T$ его биты подвергаются начальной перестановке $IP$ согласно таблице \ref{tbl:ip-permutation}. \begin{table}[h] \centering \caption{Начальная перестановка $IP$} \begin{tabular}{|c|c|c|c|c|c|c|c|} \hline 58 & 50 & 42 & 34 & 26 & 18 & 10 & 2 \\ \hline 60 & 52 & 44 & 36 & 28 & 20 & 12 & 4 \\ \hline 62 & 54 & 46 & 38 & 30 & 22 & 14 & 6 \\ \hline 64 & 56 & 48 & 40 & 32 & 24 & 16 & 8 \\ \hline 57 & 49 & 41 & 33 & 25 & 17 & 9 & 1 \\ \hline 59 & 51 & 43 & 35 & 27 & 19 & 11 & 3 \\ \hline 61 & 53 & 45 & 37 & 29 & 21 & 13 & 5 \\ \hline 63 & 55 & 47 & 39 & 31 & 23 & 15 & 7 \\ \hline \end{tabular} \label{tbl:ip-permutation} \end{table} Полученный после перестановки блок $IP(T)$ разделяется на две половины: $L_0$, состоящую из 32 старших бит, и $R_0$, состоящую из 32 младших бит. После этого следуют 16 раундов шифрования с использованием секретного ключа $k$. Пусть $T_{i - 1} = L_{i - 1} R_{i - 1}$ --- результат $(i - 1)$-й итерации. Тогда результат $i$-й итерации $T_i = L_i R_i$ определяется формулами: \begin{align*} L_i &= R_{i - 1} \\ R_i &= L_{i - 1} \oplus f(R_{i - 1}, k_i), i = \overline{1, 16} \end{align*} Функция $f$ называется \emph{функцией шифрования}. Её аргументами являются 32-битовый вектор $R_{i - 1}$ и 48-битовый ключ $k_i$, который является результатом преобразования 56-битового ключа шифра $k$. \begin{figure}[ht] \centering \includegraphics[width=0.6\textwidth]{lecture18/des-block-t.pdf} \label{fig:des-block-t} \end{figure} Результатом последней итерации является блок $T_{16} = L_{16} R_{16}$. По окончании шифрования осуществляется восстановление позиций битов применением к $T_{16}$ обратной перестановки $IP^{-1}$. При расшифровании все действия выполняются в обратном порядке, при этом следует использовать соотношения \begin{equation*} R_{i - i} &= L_i, \\ L_{i - 1} &= R_i + f(L_i, k_i),\, i = \overline{16, 1}, \end{equation*} пользуясь которыми можно <<спуститься>> от $L_{16}$ и $R_{16}$ к $L_0$ и $R_0$. На каждой итерации используется текущее значение ключа $k_i$ (48 бит), получаемое из исходного ключа $k$ следующим образом. Сначала пользователи выбирают сам ключ $k$, содержащий 56 случайных значащих битов. \item Восемь битов, находящихся в позициях 8, 16, \dots, 64 добавляются в ключ таким образом, чтобы каждый байт содержал начётное число единиц. Это используется для обнаружения ошибок при обмене и хранении ключей. \item Значащие 56 бит ключа подвергаются перестановке, приведённой в таблице \ref{tbl:des-permutation} \begin{table}[H] \centering \caption{} \begin{tabular}{|c|c|c|c|c|c|c|} \hline 57 & 49 & 41 & 33 & 25 & 17 & 9 \\ \hline 1 & 58 & 50 & 42 & 34 & 26 & 18 \\ \hline 10 & 2 & 59 & 51 & 43 & 35 & 27 \\ \hline 19 & 11 & 3 & 60 & 52 & 44 & 36 \\ \hline 63 & 55 & 47 & 39 & 31 & 23 & 15 \\ \hline 7 & 62 & 54 & 46 & 38 & 30 & 22 \\ \hline 14 & 6 & 61 & 53 & 45 & 37 & 29 \\ \hline 21 & 13 & 5 & 28 & 20 & 12 & 4 \\ \hline \end{tabular} \label{tbl:des-permutation} \end{table} Эта перестановка определяется двумя блоками $C_0$ и $D_0$ по 28 бит в каждом (они занимают соответственно верхнюю и нижнюю половину таблицы). Затем индуктивно определяются блоки $C_i$ и $D_i$, $i = \overline{1, 16}$. Если уже определены $C_{i - 1}$ и $D_{i - 1}$, то $C_i$ и $D_i$ получаются из них циклическим сдвигом влево на одну или две позиции в зависимости от номера раунда. При $i = 1, 2, 9, 16$ сдвиг на одну позицию, при остальных значениях --- на две. После сдвигов по заданному способу строится 48"=битовый раундовый ключ. \item Теперь определим ключи $k_i$, $1 \leq i \leq 16$. Ключ $k_i$ состоит из 48 битов, выбираемых из битов блока $C_i D_i$ согласно таблице \ref{tbl:des-key-blocks} \begin{table}[H] \centering \caption{} \begin{tabular}{|c|c|c|c|c|c|c|} \hline 14 & 17 & 11 & 24 & 1 & 5 \\ \hline 3 & 28 & 15 & 6 & 21 & 10 \\ \hline 23 & 19 & 12 & 4 & 26 & 8 \\ \hline 16 & 7 & 27 & 20 & 13 & 2 \\ \hline 41 & 52 & 31 & 37 & 47 & 55 \\ \hline 30 & 40 & 51 & 45 & 33 & 48 \\ \hline 44 & 49 & 39 & 56 & 34 & 53 \\ \hline 46 & 42 & 50 & 36 & 29 & 32 \\ \hline \end{tabular} \label{tbl:des-key-blocks} \end{table} Первыми тремя битами в $k_i$ являются биты 14, 17, 11 из блока $C_i D_i$. Заметим, что 8 из 56 бит (с номерами 9, 18, 22, 25, 35, 38, 43, 54) из $C_i D_i$ отсутствуют в $k_i$. \item Центральной частью шифра является предложенная Х. Фейстелем функция $f(R_{i - 1}, k_i)$. \begin{figure}[ht] \centering \includegraphics[width=0.6\textwidth]{lecture18/des-feistel.pdf} \label{fig:des-feistel} \end{figure} Для вычисления значения функции $f$ используются: функция расширения $E$; преобразование $S$, составленное из восьми преобразования S-блоков $S1, S2, \dots, S8$; перестановка $P$. Аргументами функции $f$ являются вектор $R_{i - 1}$ (32 бита) и вектор $k_i$ (48 бит). Функция $E$ <<расширяет>> 32-битовый вектор $R_{i - 1}$ до 48-битового вектора $R_{i - 1}$, при этом порядок следования битов в $E(R_{i - 1})$ указан в таблице \ref{tbl:des-feistel} \begin{table}[H] \centering \caption{} \begin{tabular}{|c|c|c|c|c|c|c|} \hline 32 & 1 & 2 & 3 & 4 & 5 \\ \hline 4 & 5 & 6 & 7 & 8 & 9 \\ \hline 8 & 9 & 10 & 11 & 12 & 13 \\ \hline 12 & 13 & 14 & 15 & 16 & 17 \\ \hline 16 & 17 & 18 & 19 & 20 & 21 \\ \hline 20 & 21 & 22 & 23 & 24 & 25 \\ \hline 24 & 25 & 26 & 27 & 28 & 29 \\ \hline 28 & 29 & 30 & 31 & 32 & 1 \\ \hline \end{tabular} \label{tbl:des-feistel} \end{table} Полученный результат складывается побитно по модулю 2 с текущим значением ключа $k_i$ и затем разбивается на 8 последовательных 6-битовых групп, каждая из которых подаётся на вход соответствующего подстановочного шифратора, так называемого S-бокса (substitution boxes --- таблицы замены, $S1, S2, \dots, S8$). S-бокс представляет собой таблицу размерности $4 \times 16$ с нумерацией строк $0, 1, 2, 3$ и столбцов от 0 до 15. В каждой строке стоит своя перестановка столбцовых номеров. \begin{table}[H] \centering \caption{} \begin{tabular}{|c|cccccccccccccccc|} \hline S7 & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 & 11 & 12 & 13 & 14 & 15 \\ \hline 0 & 4 & 11 & 2 & 14 & 15 & 0 & 8 & 13 & 3 & 12 & 9 & 7 & 5 & 10 & 6 & 1 \\ 1 & 13 & 0 & 11 & 7 & 4 & 9 & 1 & 10 & 14 & 3 & 5 & 12 & 2 & 15 & 8 & 6 \\ 2 & 1 & 4 & 11 & 13 & 12 & 3 & 7 & 14 & 10 & 15 & 6 & 8 & 0 & 5 & 9 & 2 \\ 3 & 6 & 11 & 13 & 8 & 1 & 4 & 10 & 7 & 9 & 5 & 0 & 15 & 14 & 2 & 3 & 12 \\ \hline \end{tabular} \label{tbl:des-feistel-sbox} \end{table} На вход S-бокса подаётся 6-разрядный двоичный блок $a_0 a_1 a_2 a_3 a_4 a_5$. Первый и последний его символы $a_0 a_5$ определяют строку S-бокса, средние $a_1 a_2 a_3 a_4$ --- его столбец. Стоящее на пересечении строки и столбца число даёт в двоичной записи 4-разрядный выходной блок. Переработка 6-буквенных двоичных блоков в 4-буквенные и является функцией S-бокса. \begin{example} Пусть на вход S-бокса 7 подаётся двоичное слово 001011. Оно выделяет в таблице строку с номером 1 (01) и столбец с номером 5 (0101). На их пересечении стоит число 9. Его двоичная запись 1001 и появляется на выходе. \end{example} Полученные восемь 4-битовых выходных вектора соединяются в один 32-битный. \item Значение $f(R_{i - 1}, k_i)$ получается применением перестановки битов $P$, заданной таблицей к результирующему 32-битовому блоку. \begin{table}[H] \centering \caption{} \begin{tabular}{|c|c|c|c|} \hline 16 & 7 & 20 & 21 \\ \hline 29 & 12 & 28 & 17 \\ \hline 1 & 15 & 23 & 26 \\ \hline 5 & 18 & 31 & 10 \\ \hline 2 & 8 & 24 & 14 \\ \hline 32 & 27 & 3 & 9 \\ \hline 19 & 13 & 30 & 6 \\ \hline 22 & 11 & 4 & 25 \\ \hline \end{tabular} \label{tbl:des-feistel-sbox} \end{table} \end{enumerate}