\begin{itemize}
  \item
    \textbf{Зашифрование}

    Открытый текст $P \in V^*$ представляется в виде
    $P = P_1 \| P_2 \| \dots \| P_q, P_i \in V_s$, $i = 1, 2, \dots, q - 1$,
    $P_q \in V_r$, $r \leq s$.

    Блоки шифротекста вычисляются по следующему правилу:
    \begin{align*}
      &R_1 = IV, \\
      &\begin{cases}
        C_i = P_i \oplus MSB_s(e_K(MSB_n(R_i))) \\
        R_{i + 1} = LSB_{m - s}(R_i) \| C_i \\
        i = 1, 2, \dots, q - 1 \\
      \end{cases} \\
      &C_q = P_q \oplus MSB_r(e_K(MSB_n(R_q)))
    \end{align*}
    
    Результирующий шифртекста: $C = C_1 \| C_2 \| \dots \| C_q$.

    % TODO: рис 1

  \item
    \textbf{Расшифрование}

    Шифртекст представляется в виде: $C = C_1 \| C_2 \| \dots \| C_q$, $C_i \in
    V_s$, $i = 1, 2, \dots, q - 1$, $C_q \in V_r$, $r \leq s$.

    Блоки открытого текста вычисляются по следующему правилу:
    \begin{align*}
      &R_1 = IV, \\
      &\begin{cases}
        P_i = C_i \oplus MSB_s(e_K(MSB_n(R_i))) \\
        R_{i + 1} = LSB_{m - s}(R_i) \| C_i \\
        i = 1, 2, \dots, q - 1 \\
      \end{cases} \\
      &P_q = C_q \oplus MSB_r(e_K(MSB_n(R_q)))
    \end{align*}

    Исходный (дополненный) открытый текст: $P = P_1 \| P_2 \| \dots \| P_q$.

    Если к исходному открытому тексту была применена процедура дополнения, то
    после расшифрования следует произвести обратную процедуру.

    Для однозначного восстановления сообщения может потребоваться знание длины
    исходного сообщения.

    % TODO: рис 2
\end{itemize}


\paragraph{Режим выработки имитовставки.}

Данный режим выработки имитовставки реализует конструкцию OMAC1
(стандартизирован в ISO под названием CMAC). Параметр: длина имитовставки
(в битах) $0 < s \leq n$.

\begin{itemize}
  \item
    \textbf{Выработка вспомогательных ключей.}

    При вычислении значения имитовставки используются вспомогательные ключи,
    которые вычисляются с использованием ключа $K$.

    Длины вспомогательных ключей равны длине блока $n$ базового алгоритма
    блочного шифрования.

    Процедура выработки вспомогательных ключей может быть представлена в
    следующей форме
    \begin{align*}
      R &= e_K(0^n); \\
      K_1 &= \begin{cases}
        R \ll 1, &\text{если } MSB_1(R) = 0, \\
        (R \ll 1) \oplus B_n, &\text{иначе}
      \end{cases} \\
      K_2 &= \begin{cases}
        K_1 \ll 1, &\text{если } MSB_1(K_1) = 0, \\
        (K_1 \ll 1) \oplus B_n, &\text{иначе}
      \end{cases}
    \end{align*}
    где $B_{64} = 0^{59} \| 11011$, $B_{128} = 0^{120} \| 10000111$.

    Если значение $n$ отлично от 64 и 12, следует использовать следующую
    процедуру определения значения константы $B_n$.

    Рассмотрим множество примитивных полиномов степени $n$ над полем $GF(2)$ с
    наименьшим количеством ненулевых коэффициентов.

    Упорядочим это множество лексикографически по возрастанию векторов
    коэффициентов и обозначим через $f_n(x)$ первый полином в этом упорядоченном
    множестве.

    Рассмотрим поле $GF(2^n)[x]/(f_n(x))$, зафиксируем в нём степенной базис и
    будем обозначать операцию умножения в этом поле символом $\otimes$.

    Вспомогательные ключи $K_1$ и $K_2$ вычисляются следующим образом:
    \begin{equation*}
      \begin{cases}
        R = e_K(0^n), \\
        K_1 = Poly_n^{-1}(Poly_n(R) \otimes x), \\
        K_2 = Poly_n^{-1}(Poly_n(R) \otimes x^2).
      \end{cases}
    \end{equation*}

    Вспомогательные ключи $K_1, K_2$ и промежуточное значение $R$ наряду с
    ключом $K$ являются секретными параметрами.

    Компрометация какого-либо из этих значений приводит к возможности построения
    эффективных методов анализа всего алгоритма.

  \item
    \textbf{Вычисление значения имитовставки.}

    Процедура вычисления значения имитовставки похожа на процедуру зашифрования
    в режиме простой замены с зацеплением при $m = n$ и инициализации начального
    заполнения регистра сдвига значением $0^n$: на вход алгоритму шифрования
    подаётся результат покомпонентного сложения очередного блока текста и
    результата зашифрования на предыдущем шаге.

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

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

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

    Исходное сообщение $P \in V^*$, для которого требуется вычислить
    имитовставку, представляется в виде: $P = P_1 \| P_2 \| \dots \| P_q$, где
    $P_i \in V_n,\, i = 1, 2, \dots, q - 1$, $P_q \in V_r,\, r \leq n$.

    Процедура вычисления имитовставки описывается следующим образом:
    \begin{align*}
      C_0 &= 0^n, \\
      C_i &= e_K(P_i \oplus C_{i - 1}),\, i = 1, 2, \dots, q - 1, \\
      MAC &= MSB_s(e_K(P^*_q \oplus C_{q - 1} \oplus K^*)),
    \end{align*}
    где
    \begin{equation*}
      K^* = \begin{cases}
        K_1, &\text{если } |P_q| = n, \\
        K_2, &\text{иначе},
      \end{cases}
    \end{equation*}
    $P^*_q$ --- последний блок сообщения, полученного в результате дополнения
    исходного сообщения с помощью процедуры 3.

    % TODO: рис 3
\end{itemize}
