% Лекция 15 (12.12.22)

\subsection{Поточная шифрсистема RC4}

RC4 представляет собой поточный шифр с переменной длиной ключа.

Алгоритм разработан в 1987 году Р. Ривестом для компнии RSA Data Security

Алгоритм работает в режиме обратной связи по выходу. Ключевая последовательность
не зависит от исходного текста. Структура алгоритма включает блок замены
размерностью $8 \times 8 : S_0, \dots, S_{255}$.

Блок замены представляет собой зависимую от ключа переменной длины перестановку
чисел $0, \dots, 255$.

Имеется два счётчика $i$ и $j$, первоначально равные 0.

Для генерирования псевдослучайного байта выполняются следующие действия
\begin{align*}
  i &= (i + 1) \pmod{256} \\
  j &= (j + S_i) \pmod{256} \\
    &\text{переставить } S_i \text{ и } S_j \\
  t &= (S_i + S_j) \pmod{256} \\
  k &= S_i \\
\end{align*}

Затем байт $k$ складывается по модулю 2 с байтом исходного текста для получения
криптограммы.

Блок замены инициализируется следующим образом. Сначала он заполняется линейно:
$S_0 = 0, S_1 = 1, \dots S_{255} = 255$.

Затем заполняется ещё один 256-байтовый массив ключом, при этом ключ может
повторяться необходимое число раз для заполнения всего массива $k_0, \dots,
k_{255}$.

Счётчик $j$ устанавливается в 0. После этого производятся следующие действия:
\begin{algorithm}
  \For {$i = 0 \to 255$} {
    $j = (j + k_i + S_i) \pmod{256}$\;
    Переставить $S_i$ и $S_j$\;
  }
\end{algorithm}

\subsection{Методы анализа поточных шифров}

Некоторые методы анализа поточных шифров на примере шифров гаммирования:
\begin{itemize}
  \item Исследование вероятностных характеристик гаммы;
  \item
    Попытки линеаризации уравнений гаммообразования, то есть сведения задачи
    нахождения ключей криптографических алгоритмов к решению некоторой системы
    линейных уравнений;
  \item
    Применение методов анализа, основанные на наличии у функции усложнения
    хороших приближений в классе линейных функций;
  \item
    Необходимо учитывать наличие между знаками гаммы зависимостей комбинаторного
    характера.
\end{itemize}


\section{Блочные шифрсистемы}

\emph{Блочный шифр} --- шифр, в котором открытый текст перед шифрованием
разбивается на блоки, состояние из нескольких знаков, то есть исходное
сообщение обрабатывается блоками.

\subsection{Принципы построения}

Как правило, алфавитом, на котором действует блочный шифр, является множество
двоичных векторов-блоков открытого текста одинаковой длины (64, 128 и т. д.).

К. Шеннон сформулировал общий принцип построения шифрующих преобразований ---
принцип \emph{<<перемшивания>>}.

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

Обеспечить выполнение данного требования в сочетании с простотой реализации
конкретного отображения в общем случае представляется затруднительным.

Поэтому К. Шеннон предложил реализовывать сложные преобразования в виде
суперпозиции нескольких простых некоммутирующих отображений, что используется
при построении блочных шифров.

Блочные шифры реализуются путём многократного применения к блокам открытого
текста некоторых базовых преобразований.

Обычно используются базовые преобразования двух типов:
\begin{enumerate}
  \item
    <<Перемешивающие>> --- сложные в криптографическом отношении локальные
    преобразования над отдельными частями шифруемых блоков.

    Перемешивание усложняет восстановление взаимосвязи статистических 
    аналитических свойств открытого текста и криптограммы;
  \item
    <<Рассеивающие>> --- простые преобразования, переставляющие между собой
    части шифруемых блоков.

    Рассеивание распространяет влияние одного знака открытого текста на большое
    число знаков криптограммы, что позволяет сгладить влияние статистических
    свойств открытого текста на свойства криптограммы.
\end{enumerate} 

Алгоритм шифрования выполняет некоторое число циклов (итераций). Каждый цикл в
применении преобразований первого и второго типов.

Такой принцип построения даёт возможность реализовать каждый цикл шифрования с
использованием однотипных узлов, а также выполнять расшифрование путём обработки
данных в обратном направлении.

Удобной моделью для реализации базовых преобразований служат \emph{регистры
сдвига}. При этом рассеивающие преобразования определяются функциями обратной
связи, а перемешивающие --- сдвигами информации в регистре.


\subsection{Структура алгоритмов}

\paragraph{Сеть Фейстеля.}

Для построения алгоритмов часто используется \emph{Сеть Фейстеля} (см. рисунок).
\begin{figure}[H]
  \centering
  \includegraphics[width=0.8\textwidth]{lecture15/feistel}
  \caption{Сеть Фейстеля}
\end{figure}

Преобразование, реализуемое сетью Фейстеля в $i$-м цикле шифрования имеет вид
\begin{equation*}
  \begin{cases}
    Y_1 = X_2 \\
    Y_2 = X_1 \oplus f_i(X_2, k_i)
  \end{cases}
\end{equation*}
где $X$ --- входной блок, разделённый на две половины $X_1$ и $X_2$, а $(Y_1,
Y_2)$ --- результат зашифрования блока $X$ на ключе $k_i$ с помощью функции
$f_i$.

Алгоритм шифрования реализуется несколькими итерациями преобразования сети
Фейстеля с использованием ключа $k$.

При этом очередная $i$-я итерация использует в качестве входного блока $X$
результат предыдущей итерации и ключ $k_i$, вычисляемый определённым образом
по ключу $k$.

Функция $f_i$ может зависеть или не зависеть от номера итерации.

Даже если $f_i$ не является обратимой функцией, преобразование сети Фейстеля
обратимо:
\begin{equation*}
  \begin{cases}
    X_1 = Y_2 \oplus f_i(Y_1, k_i) \\
    X_2 = Y_1
  \end{cases}
\end{equation*}

На сети Фейстеля основаны, например, алгоритмы шифрования DES, ГОСТ 28147-89,
RC5.

\paragraph{SP-сети.}

В отличие от сети Фейстеля, SP-сети (Substitution-Permutation network,
подстановочно-перестановочная сеть) обрабатывает за один раунд целиком
шифруемый блок.

Обработка данных сводится в основном к заменам и перестановкам зависящим от
ключа $k_i$ (см. рисунок).
\begin{figure}[H]
  \centering
  \includegraphics[width=0.6\textwidth]{lecture15/sp}
  \caption{SP-сеть}
\end{figure}

SP-сети являются гораздо менее распространёнными, чем сети Фейстеля. На их базе,
например, основаны алгоритмы шифрования Serpent, SAFER+.


\subsection{S-блоки}

Операторы подстановки в блочных шифрах называются S-боксами (блок подстановки,
узлы замены).

На вход в S-бокса подаётся $n$-битовый блок, а на выходе --- $m$-битовый блок,
где $m$ может быть отлично от $n$.

Пусть в S-боксе $x_1, x_2, \dots, x_n$ --- входы, $y_1, y_2, \dots, y_m$ ---
выходы, тогда связь между ними задаёт система уравнений:
\begin{equation*}
  \begin{cases}
    y_1 = f_1(x_1, x_2, \dots, x_n) \\
    y_2 = f_2(x_1, x_2, \dots, x_n) \\
    \dots \\
    y_m = f_m(x_1, x_2, \dots, x_n) \\
  \end{cases}
\end{equation*}

S-боксы делятся на линейные и нелинейные. В линейном S-боксе эту связь можно
записать в виде линейных соотношений:
\begin{equation*}
  \begin{cases}
    y_1 = a_{11} x_1 \oplus a_{12} x_2 \oplus \dots \oplus a_{1n} x_n \\
    y_2 = a_{21} x_1 \oplus a_{22} x_2 \oplus \dots \oplus a_{2n} x_n \\
    \dots \\
    y_m = a_{m1} x_1 \oplus a_{m2} x_2 \oplus \dots \oplus a_{mn} x_n \\
  \end{cases}
\end{equation*}

В нелинейном S-боксе нельзя задать линейные соотношения для каждого выхода.

Пример S-бокса представлен в таблице, где первый бит входа определяет строку,
два следующих бита входа определяют столбец. Два бита на выходе --- это значение
на пересечении выбранных строки и столбца.
\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|c|}
    \cline{2-5}
    \multicolumn{1}{c|}{} &
    \textbf{00} & \textbf{01} & \textbf{10} & \textbf{11} \\ \hline
    \textbf{0}            & 00 & 01 & 10 & 11 \\ \hline
    \textbf{1}            & 00 & 01 & 10 & 11 \\ \hline
  \end{tabular}
  \caption{Пример S-блока}
\end{table}

\begin{example}
  Вход --- 110; Выход --- 11.
\end{example}
