summaryrefslogtreecommitdiff
path: root/cryptography/lectures/lecture20.tex
blob: 431ac206b10fcd84cba8295701adc89ce4745ac0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
% Лекция 20 (10.03.23)

Шифр AES является чисто алгебраической криптосистемой. В шифре AES
обрабатываются блоки длины 128 бит. Возможная длина ключа --- 128, 192 или 256
бит. При 128-битном ключе осуществляется 10 раундов шифрования. Обрабатываемый
128-битный блок разбивается на 16 блоков.

Они образуют поле $GF(2^8)$, то есть интерпретируются как многочлены степени 8
над полем вычетов $\Z_2 = GF(2)$.

\begin{example}
  $11001110 = x + x^2 + x^3 + x^6 + x^7$
\end{example}

Сложение $+$ --- это обычное сложение многочленов над $\Z_2$, иначе говоря,
поразрядное сложение байтов по модулю 2.

\begin{example}
  $01010111 + 10000011 = 11010100$
\end{example}

Чтобы получить произведение $\cdot$ байтов, их перемножают как многочлены над
$\Z_2$ и берут остаток от деления результата на неприводимый многочлен $m(x) =
x^8 + x^4 + x^3 + x + 1$.

% FIXME: Расписать пример 1?
\begin{example}
  $01010111 \cdot 10000011 = \dots = 11000001$
\end{example}

Все блоки, проходящие через алгоритм, называются состояниями (States), входной
блок --- это начальное состояние (Initial State). Состояние представляется в
виде массива байтов размерности $4 \times 4$.

Таблица --- Состояние.
\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{10}$ & $S_{11}$ & $S_{12}$ & $S_{13}$ \\ \hline
    $S_{20}$ & $S_{21}$ & $S_{22}$ & $S_{23}$ \\ \hline
    $S_{30}$ & $S_{31}$ & $S_{32}$ & $S_{33}$ \\ \hline
  \end{tabular}
\end{table}

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

Таблица --- Ключ.
\begin{table}[H]
  \centering
  \begin{tabular}{|c|c|c|c|}
    \hline
    $K_{00}$ & $K_{01}$ & $K_{02}$ & $K_{03}$ \\ \hline
    $K_{10}$ & $K_{11}$ & $K_{12}$ & $K_{13}$ \\ \hline
    $K_{20}$ & $K_{21}$ & $K_{22}$ & $K_{23}$ \\ \hline
    $K_{30}$ & $K_{31}$ & $K_{32}$ & $K_{33}$ \\ \hline
  \end{tabular}
\end{table}

Раундовое преобразование состоит из четырёх операций:
\begin{enumerate}
  \item Замена байтов SubBytes;
  \item Сдвиг строк ShiftRows;
  \item Перемешивание столбцов MixColumns;
  \item Прибавление раундового ключа AddRoundKey.
\end{enumerate}

\paragraph{Замена байтов SubBytes.}

Над байтом-аргументом осуществляются следующие действия:
\begin{enumerate}
  \item
    В поле $GF(2^8)$ для этого байта берётся обратный элемент (для нуля им
    считается ноль);
  \item
    К полученному байту $b$, рассматриваемому как вектор-столбец над $\Z_2$,
    применяется преобразование
    \begin{equation*}
      b\ = \fn{SubBytes}(b) = Ab + c
    \end{equation*}
    где
    \begin{equation*}
      A = \begin{vmatrix}
        1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\
        1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 \\
        1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\
        1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\
        1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\
        0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\
        0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\
        0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \\
      \end{vmatrix},\,
      c = \begin{vmatrix}
        1 \\
        1 \\
        0 \\
        0 \\
        0 \\
        1 \\
        1 \\
        0 \\
      \end{vmatrix}
    \end{equation*}
\end{enumerate}


\paragraph{Сдвиг строк ShiftRows.}

В аргументе-состоянии первая строка остаётся неизменной, вторая сдвигается
циклически влево на 1 байт, третья --- на 2 байта, четвёртая --- на 3 байта.

\begin{table}[H]
  \centering
  \caption{State}
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{10}$ & $S_{11}$ & $S_{12}$ & $S_{13}$ \\ \hline
    $S_{20}$ & $S_{21}$ & $S_{22}$ & $S_{23}$ \\ \hline
    $S_{30}$ & $S_{31}$ & $S_{32}$ & $S_{33}$ \\ \hline
  \end{tabular}
\end{table}

\begin{table}[H]
  \centering
  \caption{ShiftRows(State)}
  \begin{tabular}{|c|c|c|c|}
    \hline
    $S_{00}$ & $S_{01}$ & $S_{02}$ & $S_{03}$ \\ \hline
    $S_{11}$ & $S_{12}$ & $S_{13}$ & $S_{10}$ \\ \hline
    $S_{22}$ & $S_{23}$ & $S_{20}$ & $S_{21}$ \\ \hline
    $S_{33}$ & $S_{30}$ & $S_{31}$ & $S_{32}$ \\ \hline
  \end{tabular}
\end{table}

\paragraph{Перемешивание столбцов MixColumns.}

Образ столбца-аргумента $s_i, 0 \leq i \leq 3$, из состояния вычисляется как
произведение над $GF(2^8): s'_i = \fn{MixColumns}(s_i) = S s_i$, где
\begin{equation*}
  S = \begin{vmatrix}
    \set{2} & \set{3} & \set{1} & \set{1} \\
    \set{1} & \set{2} & \set{3} & \set{1} \\
    \set{1} & \set{1} & \set{2} & \set{3} \\
    \set{3} & \set{1} & \set{1} & \set{2} \\
  \end{vmatrix}
\end{equation*}
где $\set{n}$ --- двоичная восьмибитовая запись числа $n$.

Применение операции ко всем четырём столбцам состояния обозначается
$\fn{MixColumns}(\fn{State})$.


\paragraph{Прибавление раундового ключа AddRoundKey.}

Поразрядно по модулю 2 к состоянию прибавляется раундовый ключ.

Как осуществляется выработка раундовых ключей (KeySchedule)?

Первым этапом является расширение ключа (KeyExpansion).

Расширенный ключ в AES представляет собой линейный массив длиной 1408 битов,
разбитый на 44 слова, состоящих из 4 байтов каждое.

\begin{equation*}
  \underbrace{w_0 w_1 w_2 w_3}_{K_0} \underbrace{w_4 w_5 w_6 w_7}_{K_1} w_8 \dots w_{39}
  \underbrace{w_{40} w_{41} w_{42} w_{43}}_{K_{10}}
\end{equation*}

При этом первые 4 слова --- ключ шифрования $K = K_0$. Все остальные слова
определяются рекурсивно из слов с меньшими индексами:
\begin{enumerate}
  \item Если $4 \nmid i$, то $w_i = w_{i - 1} \oplus w_{i - 4}$;
  \item Пусть $4 \mid i$.
\end{enumerate}

В слове $w_{i - 1}$ осуществляется побайтовый сдвиг $w_{i - 1} = b_0 b_1 b_2 b_3
\mapsto b_1 b_2 b_3 b_0 = \fn{RotWord}(w_{i - 1}) = w'_{i - 1}$.

В итоге, $w_i = \fn{SubWord}(\fn{RotWord}(w_{i - 1})) \oplus \fn{Rcon} \left(
\frac{i}{4} \right) \oplus w_{i - 4}$. Здесь $\fn{Rcon}(j)$ --- раундовая
константа, равная $2^{j - 1}$.

Выбор раундового ключа (Round Key Selection) для раунда с номером $i$
производится выделением из расширенного ключа массива слов
\begin{equation*}
  w_{4i} w_{4i + 1} w_{4i + 2} w_{4i + 3}
\end{equation*}

\begin{figure}[ht]
  \centering
  \includegraphics[width=0.8\textwidth]{lecture20/aes-scheme}
  \caption{Схема шифрования}
  \label{fig:aes-scheme}
\end{figure}

Все четыре преобразования SubBytes, ShiftRows, MixColumns, AddRoundKey обратимы
(у последнего обратное совпадает с ним самим).

При дешифровании к выходному блоку криптограммы в обратной по отношению
к шифрованию последовательности выполняются инверсии соответствующих
преобразований. При этом меняется и порядок использования раундовых ключей
$(K_{10}, K_9, \dots, K_1, K_1)$.


\subsection{ГОСТ Р 34.12-2015}

В конце 1989 года был открыт и зарегистрирован в качестве государственного
стандарта шифрования ГОСТ 28147-89 <<Система обработки информации. Защита
криптографическая. Алгоритм криптографического преобразования>>.

Данный блочный шифр был разработан в 1978 году группой советских криптографов
во главе с И. А. Заботиным в 8-м главном управлении КГБ СССР.

Он был предназначен для шифрования сообщений, содержащих высшие грифы
секретности (государственная тайна) и сам имел гриф <<совершенно секретно>>.

В 1988 году гриф шифра был понижен до <<секретно>>, в 1989 году --- для
служебного пользования.

В 2015 году утверждён новый национальный стандарт РФ ГОСТ Р 34.12-2015
<<Информационная технология. Криптографическая защита информации. Блочные
шифры>>.

Разработан Центром защиты информации и специальной связи ФСБ России с участием
ОАО <<ИнфоТеКС>>. Утверждён и введён в действие Приказом Федерального агентства
по техническому регулированию и метрологии от 19 июня 2015 г. №749-ст.

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

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

В настоящем стандарте приведено описание двух базовых блочных шифров с длинами
блоков $n = 128$ бит (<<Кузнечик>>) и $n = 64$ бит (<<Магма>>) и длинами ключей
$k = 256$ бит.