% Лекция 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}
