\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}