Опубликован: 02.03.2017 | Доступ: свободный | Студентов: 2512 / 557 | Длительность: 21:50:00
Лекция 7:

Современные симметричные алгоритмы шифрования

7.3 Исследование устойчивости блочных шифров

Для количественного анализа устойчивости процедур преобразования данных в ходе шифрования используется их представление в виде структур, состоящих из булевых функций. Этот же метод позволяет оценивать зависимость криптостойкости шифрования от выбранной ключевой информации, определяя, таким образом, критерии выбора "сильных" ключей и блоков замен (в случае ГОСТ 28147-89 и других, менее распространенных шифров с секретными блоками замен).Здесь мы кратко изложим метод исследования устойчивости алгоритма блочного шифрования к наиболее распространенным атакам, подробнее см. [2].

7.3.1 Количественные характеристики устойчивости шифрования

Определение 7.1 Булевой функцией называется отображение {\left\{0,1\right\}}^{n}\rightarrow \left\{0,1\right\}, то есть правило, однозначно сопоставляющее вектору из n бит значение 0 или 1.

Способы задания булевой функции [2]:

1) Табличный -- в виде таблицы, каждая строка которой задает значение функции при определенном наборе значений входных переменных. Число строк такой таблицы равно {2}^{n}.

Пример 7.1 Таблица 7.2 задаёт булеву функцию f\left({x}_{0},{x}_{1},{x}_{2}\right).

Таблица 7.2. Табличный способ задания булевой функции
{x}_{2} {x}_{1} {x}_{0} f\left({x}_{0},{x}_{1},{x}_{2}\right)
0 0 0 0
0 0 1 1
0 1 0 1
0 1 1 0
1 0 0 1
1 0 1 0
1 1 0 0
1 1 1 1

2) Векторный -- в виде вектора, состоящего из значений булевой функции, выписанных в порядке возрастания аргумента, если его представить в виде числа от 0 до 2^n-1. В самом деле, вместо n логических переменных {x}_{0},{x}_{1},{{\dots},x}_{n-1} в качестве аргумента функции можно использовать n-битное целое число

x={x}_{0}+{x}_{1}{\cdot}2+{x}_{2}{\cdot}{2}^{2}+{\dots}+{x}_{n-1}{\cdot}{2}^{n-1}=\sum\limits_{i=0}^{n-1}{{x}_{i}{\cdot}{2}^{i}}.

Функция из примера 1 в векторном виде будет представлена следующим образом: f\left({x}_{0},{x}_{1},{x}_{2}\right)=\left(01101001\right) (последний столбец таблицы выписан сверху вниз).

3) Аналитический -- в виде формулы, выражающей зависимость значения функции от значений ее аргументов.

Функция из примера 7.1 в аналитическом виде можно представить следующим образом: f\left({x}_{0},{x}_{1},{x}_{2}\right)={x}_{0}\oplus {x}_{1}\oplus {x}_{2}, где \oplus - операция сложения бит по модулю 2 (XOR).

Определение 7.2 Весом булевой функции называется количество наборов значений входных переменных, при которых она принимает значение 1.

Проще говоря, это число единиц в векторном представлении булевой функции. Так, вес функции из примера 1 равен 4 (так как из 8 бит в векторе \left(01101001\right) 4 единицы). Обозначается \wt (f), например, \wt \left(01101001\right)=4.

Определение 7.3 Расстоянием между двумя булевыми функциями называется вес их побитовой суммы по модулю 2 в векторном виде (число позиций вы векторах, в которых значения функции различны).

Обозначается \dist({f}_{1},{f}_{2}), например, \dist\left(01101001,00101111\right)=3, так как значения функций различаются при x=1,x=5 и x=6.

Определение 7.4 Линейной называется булева функция аналитического вида

f\left({x}_{0},{x}_{1},{\dots},{x}_{n-1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}\oplus {\dots}\oplus {a}_{n-1}{x}_{n-1}=\sum\limits_{i=0}^{n-1}{{a}_{i}{x}_{i}}.

где {a}_{0},{a}_{1},{\dots},{a}_{n-1}{\in}\left\{0,1\right\} -- произвольные значения 0 или 1. Множество всех линейных функций от n переменных обозначим {L}_{n}.

Пример 7.2 Построим все линейные булевы функции от 2 переменных.

Для этого нам нужно перебрать все различные комбинации бит {a}_{0},{a}_{1}{\in}\left\{0,1\right\}:

  1. {a}_{0}=0,{a}_{1}=0\Rightarrow f\left({x}_{0},{x}_{1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}=0, или в векторном виде f\left({x}_{0},{x}_{1}\right)=\left(0000\right).
  2. {a}_{0}=1,{a}_{1}=0\Rightarrow f\left({x}_{0},{x}_{1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}={x}_{0}, или в векторном виде f\left({x}_{0},{x}_{1}\right)=\left(0101\right), так как функция принимает значение 1 тогда и только тогда, когда младший бит {x}_{0} аргумента равен 1, а это достигается при значениях аргумента 1 и 3 -- следовательно, в векторе на 0-й и 2-й позициях стоят 0, а на 1-й и 3-й -- 1.
  3. {a}_{0}=0,{a}_{1}=1\Rightarrow f\left({x}_{0},{x}_{1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}={x}_{1}, или в векторном виде f\left({x}_{0},{x}_{1}\right)=\left(0011\right).
  4. {a}_{0}=1,{a}_{1}=1\Rightarrow f\left({x}_{0},{x}_{1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}={x}_{0}\oplus {x}_{1}, или в векторном виде f\left({x}_{0},{x}_{1}\right)=\left(0110\right) - значение функции равно сумме по модулю 2 старшего и младшего битов аргумента.

Таким образом, множество линейных функций от 2 переменных:

{L}_{2}=\left\{\left(0000\right), \left(0101\right), \left(0011\right), \left(0110\right)\right\}.

Определение 7.5 Аффинной называется булева функция аналитического вида

f\left({x}_{0},{x}_{1},{\dots},{x}_{n-1}\right)={{a}_{0}x}_{0}\oplus {{a}_{1}x}_{1}\oplus {\dots}\oplus {a}_{n-1}{x}_{n-1}\oplus b=\sum _{i=0}^{n-1}{{a}_{i}{x}_{i}\oplus b},

где {a}_{0},{a}_{1},{\dots},{a}_{n-1},b{\in}\left\{0,1\right\} -- произвольные значения 0 или 1. Множество всех аффинных функций от n переменных обозначим {A}_{n}.

Как нетрудно заметить, единственным отличием общего аналитического вида аффинных функций от линейных является наличие свободного члена b, при этом если b=0, то функция является линейной, а при b=1 функция в векторном виде является побитовой инверсией соответствующей линейной в (при тех же значениях коэффициентов {a}_{0},{a}_{1},{\dots},{a}_{n-1}).

Таким образом, множество всех аффинных функций от n переменных есть объединение множества всех линейных функций от n переменных и множества их побитовых инверсий: {A}_{n}={L}_{n}{\cup}\left\{f:\overline{{f}}{\in}{L}_{n}\right\}.

Пример 7.3 Построим все аффинные булевы функции от 2 переменных.

Для этого нам нужно объединить уже построенное в примере 2 множество всех линейных булевых функций от 2 переменных с множеством их побитовых инверсий:

{A}_{2}=\left\{\left(0000\right),\left(0101\right),\left(0011\right),\left(0110\right),\left(1111\right),\left(1010\right),\left(1100\right),\left(1001\right)\right\}.

Нелинейностью булевой функции называется минимальное расстояние от этой функции до множества аффинных функций: \nl \left(f\right)=\min\limits_{c\in A_n}\dist\left(f,c\right).

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

Пример 7.4 ([2]) Определим нелинейность функции 2 переменных f\left({x}_{0},{x}_{1}\right)=\left(1101\right).

Сначала необходимо построить множество всех аффинных функций от 2 переменных (мы это сделали в примере 3):

{A}_{2}=\left\{\left(0000\right),\left(0101\right),\left(0011\right),\left(0110\right),\left(1111\right),\left(1010\right),\left(1100\right),\left(1001\right)\right\}

Теперь поочередно вычисляем расстояние от функции f\left({x}_{0},{x}_{1}\right) до каждой из функций этого множества и находим минимум:

nl \left(f\right)=\min \left\{\begin{matrix}d\left(1101,0000\right),d\left(1101,0101\right),d\left(1101,0011\right),d\left(1101,0110\right),\\ d\left(1101,1111\right),d\left(1101,1010\right),d\left(1101,1100\right),d\left(1101,1001\right)\end{matrix}\right\}=\\ \min\left\{3,1,3,3,1,3,1,1\right\}=1.

Определение 7.6 Динамическим расстоянием j -го порядка булевой функции f\left({x}_{0},{x}_{1},{\dots},{x}_{n-1}\right) называется число, вычисляемое по формуле:

DD_j\left(f\right)=\max\limits_{\substack{d\in\{0,1\}^n\\1\leq wt (d)\leq j}} \frac{1}{2}\left|{2}^{n-1}-\sum \limits_{x{\in}{\left\{0,1\right\}}^{n}}{f\left(x\right)\oplus f\left(x\oplus d\right)}\right|.

Динамическое расстояние характеризует степень соответствия функции критерию лавинного эффекта, который заключается в том, что при изменении бит на входе выходное значение функции должно меняться с вероятностью \frac{1}{2}. Порядок динамического расстояния характеризует число одновременно изменяемых бит. При динамическом расстоянии j -го порядка, равном 0, говорят, что функция удовлетворяет строгому критерию лавинного эффекта j-го порядка, что означает следующее: при одновременном инвертировании любых j бит на входе функции ее значение инвертируется с вероятностью ровно \frac{1}{2}.

Пример 7.5 ([2]) Определим динамическое расстояние 1 и 2 порядка функции 2 переменных f\left({x}_{0},{x}_{1}\right)=\left(1101\right).

Разберемся с нашим определением. Вектор d -- это двоичный вектор длиной n, причем такой, что его вес не превышает порядка определяемого динамического расстояния.

Таким образом, для нашей функции 2 переменных при определении динамического расстояния порядка 1 вектор d может принимать 2 значения: d=\left(01\right) и d=\left(10\right).

Заметим также, что в сумме в формуле динамического расстояния суммирование ведется по всем возможным значениям аргумента функции x -- двоичного вектора длиной n.

Теперь вычисляем динамическое расстояние по формуле:

\begin{align*}DD_1(f)=\max \left\{\frac{1}{2}\left|2-\sum \limits_{x{\in}{\left\0,1\right\}}^{2}}{f\left(x\right)\oplus f\left(x\oplus 01\right)}\right|,\right.\\
\left.\frac{1}{2}\left|2-\sum \limits_{x{\in}{\left\{0,1\right\}}^{2}}{f(x)\oplus f(x\oplus 10)}\right|\right\}=\end{align*}
%
\begin{align*}=\max \left\{\frac{1}{2}\left|2-f\left(00\right)\oplus f\left(00\oplus 01\right)-f\left(01\right)\oplus f\left(01\oplus 01\right)-\right.\right.\\%\end{multline*} \\
\left.\left. f\left(10\right)\oplus f\left(10\oplus 01\right)-f\left(11\right)\oplus f\left(11\oplus 01\right)\right|,\right.\\
\hphantom{\max \left\{\vphantom{\frac{1}{2}}\right.}
\left.\frac{1}{2}\left|2-f\left(00\right)\oplus f\left(00\oplus 10\right)-f\left(01\right)\oplus f\left(01\oplus 10\right)-\right.\right.\\
\left.\vphantom{\frac{1}{2}}\left.-f\left(10\right)\oplus f\left(10\oplus 10\right)-f\left(11\right)\oplus f\left(11\oplus 10\right)\right|\right\}=\end{align*}
%
\begin{align*}=\max \left\{\frac{1}{2}\left|2-f\left(00\right)\oplus f\left(01\right)-f\left(01\right)\oplus f\left(00\right)-f\left(10\right)\oplus f\left(11\right)-\right.\right. \\
\left.\left.f\left(11\right)\oplus f\left(10\right)\right|, \frac{1}{2}\left|2-f\left(00\right)\oplus f\left(10\right)-f\left(01\right)\oplus f\left(11\right)-\right.\right.=\\
\left.\left. f\left(10\right)\oplus f\left(00\right)-f\left(11\right)\oplus f\left(01\right)\right|\right\} = \\
\max \left\{\frac{1}{2}\left|2-1\oplus 1-1\oplus 1-0\oplus 1-1\oplus 0\right|\right.,\left.\frac{1}{2}\left|2-1\oplus 0-1\oplus 1-\right.\right.\\
\left.\left.-0\oplus 1-1\oplus 1\right|\right\}=\\
=\max \left\{\frac{1}{2}\left|2-0-0-1-1\right|;\frac{1}{2}\left|2-1-0-1-0\right|\right\}=\\
=\max \left\{0;0\right\}=0\end{align*}

Чтобы теперь определить динамическое расстояние этой функции 2-го порядка, необходимо еще раз вычислить значение выражения, стоящего под знаком максимума, при d=\left(11\right) -- так как максимальный вес вектора d уже становится равным 2:

\begin{align*}DD_2\left(f\right)=\max \left\{DD_1\left(f\right);\frac{1}{2}\left|2-\sum \limits_{x{\in}{\left\{0,1\right\}}^{2}}{f\left(x\right)\oplus f\left(x\oplus 11\right)}\right|\right\}=\\
\max \left\{0;\frac{1}{2}\left|2-f\left(00\right)\oplus f\left(00\oplus 11\right)-f\left(01\right)\oplus f\left(01\oplus 11\right)-\right.\right.\\
\left.\left.\vphantom{\frac{1}{2}}
-f\left(10\right)\oplus f\left(10\oplus 11\right)-f\left(11\right)\oplus f\left(11\oplus 11\right)\right|\right\}
=\\
\max \left\{0;\frac{1}{2}\left|2-f\left(00\right)\oplus f\left(11\right)-f\left(01\right)\oplus f\left(10\right)
-f\left(10\right)\oplus f\left(01\right)\right.\right.\\
\left.\left.\vphantom{\frac{1}{2}}
-f\left(11\right)\oplus f\left(00\right)\right|\right\}=\max\left\{0;\frac{1}{2}\left|2-1\oplus 1-1\oplus 0-0\oplus 1-1\oplus 1\right|\right\}=\\
\max \left\{0;\frac{1}{2}\left|2-0-1-1-0\right|\right\}=\max \left\{0;0\right\}=0 \end{align*}

Таким образом, {\DD }_{1}\left(f\right)={\DD }_{2}\left(f\right)=0.

Определение 7.7 Блоком замен n\times m бит называется отображение {\left\{0,1\right\}}^{n}\rightarrow {\left\{0,1\right\}}^{m}, то есть отображение, однозначно сопоставляющее любому входному вектору из n бит выходной вектор из m бит.

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

Способы задания блока замен:

1) Табличный -- в виде таблицы, каждая строка которой содержит значения выходных бит блока при определенном наборе значений входных бит. Число строк такой таблицы равно {2}^{n}.

Пример 7.6 Таблица 7.3 задаёт блок замен {S:\left\{0,1\right\}}^{3}\rightarrow {\left\{0,1\right\}}^{3}.

Таблица 7.3. Табличный способ задания блока замен
{x}_{2} {x}_{1} {x}_{0} {f}_{2}\left({x}_{2},{x}_{1},{x}_{0}\right) {f}_{1}\left({x}_{2},{x}_{1},{x}_{0}\right) {f}_{0}\left({x}_{2},{x}_{1},{x}_{0}\right)
0 0 0 0 0 1
0 0 1 1 1 0
0 1 0 1 1 1
0 1 1 0 0 1
1 0 0 0 0 0
1 0 1 0 0 1
1 1 0 1 0 1
1 1 1 1 1 0

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

2) Векторный -- в виде вектора, состоящего из значений блока замен, представленных в виде десятичного n-битного числа, расположенных в порядке возрастания соответствующих значений аргумента, если их представить в виде в виде числа от 0 до {2}^{n}-1 (аналогично тому, как это делается при записи булевой функции в векторной форме).

Так, блок замен S из примера 7.6 в векторной форме будет записываться следующим образом: \left(1,6,7,1,0,1,5,6\right) (3-битовые значения на выходе блока представлены в виде целых чисел и выписаны сверзу вниз).

3) Аналитический -- в виде аналитически записанной зависимости выходных бит блока от входных. Например, в аналитической форме n\times m битный блок замены S путем целочисленного сложения с числом k по модулю {2}^{m} можно записать следующим образом: S\left(x\right)=x+k (\mod {2}^{m}).

Схема представления узла замен ГОСТ 28147-89 в виде битовой матрицы

Рис. 7.4. Схема представления узла замен ГОСТ 28147-89 в виде битовой матрицы

Пусть S -- блок замен n\times m бит, и {f}_{0},{f}_{1},{\dots},{f}_{m-1} -- булевы функции, выражающие зависимость соответствующих номерам функций выходных бит блока от входных. Иначе говоря, это столбцы правой части таблицы при записи блока замен в табличной форме (см. рис. 7.4). Тогда нелинейность блока замен есть минимальная нелинейность всех возможных нетривиальных линейных комбинаций функций {f}_{0},{f}_{1},{\dots},{f}_{m-1}:

nl\left(S\right)=\min\limits_{\substack{c\in \{0,1\}^m\\c\neq 0}} nl \left({c}_{0}{f}_{0}\oplus {c}_{1}{f}_{1}\oplus {\dots}\oplus {c}_{m-1}{f}_{m-1}\right)

где c={c}_{0}+{c}_{1}{\cdot}2+{c}_{2}{\cdot}{2}^{2}+{\dots}+{c}_{m-1}{\cdot}{2}^{m-1}.

Например, нелинейность блока из примера 7.6 будет рассчитываться следующим образом:

\begin{align*}nl(S)=\min \left\{nl \left({f}_{0}\right),nl \left({f}_{1}\right),nl \left({f}_{2}\right),nl \left({f}_{0}\oplus {f}_{1}\right),nl \left({f}_{0}\oplus {f}_{2}\right),nl \left({f}_{1}\oplus {f}_{2}\right),\right.\\
\left. nl \left({f}_{0}\oplus {f}_{1}\oplus {f}_{2}\right)\right\}=\\
\min \left\{nl (10110110),nl (01100001),nl (01100011),nl (11010111),nl (11010101),\right. \\
\left. nl (00000010); nl (10110100)\right\}=\\
\min \left\{\text{1;1;2;2;1;1;2}\right\}=1\end{align*}

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

Определение 7.8 Динамическое расстояние блока замен порядка \left(i,j\right) определяется следующим образом:

\begin{equation*} {\mathit{DD}}_{i,j}\left(S\right)=\underset{\begin{matrix}c{\in}{\left\{0,1\right\}}^{m}\\1{\leq}\wt \left(c\right){\leq}i\end{matrix}}{\mathit{max}}{\mathit{DD}}_{j}\left({c}_{0}{f}_{0}\oplus {c}_{1}{f}_{1}\oplus {\dots}\oplus {c}_{m-1}{f}_{m-1}\right) \end{equation*}

Таким образом, динамическое расстояние блока порядка \left(i,j\right) есть максимальное динамическое расстояние порядка j всех нетривиальных линейных комбинаций не более чем из i функций из набора {f}_{0},{f}_{1},{\dots},{f}_{m-1}.

Смысл порядка динамического расстояния блока замен состоит в следующем: динамическое расстояние порядка (i,j) характеризует степень отклонения вероятности изменения любого i числа битов, не превышающего i, на выходе блока от значения 1/2 при одновременном инвертировании не более j битов на входе. Если динамическое расстояние блока замен порядка i,j равно 0, то это означает, что при одновременном изменении не более j битов на входе блока любой набор из не более чем i бит на выходе одновременно изменится с вероятностью ровно 1/2.

Например, динамическое расстояние порядка \left(2,1\right) блока из примера 7.6 будет рассчитываться следующим образом:

\begin{align*} {DD}_{2,1}\left(S\right)=\max \left\{{DD}_{1}\left({f}_{0}\right),{DD}_{1}\left({f}_{1}\right),{DD}_{1}\left({f}_{2}\right),{DD}_{1}\left({f}_{0}\oplus {f}_{1}\right),\right.\\
\left. {DD}_{1}\left({f}_{0}\oplus {f}_{2}\right),{DD}_{1}\left({f}_{1}\oplus {f}_{2}\right)\right\}= \\
=\max \left\{{DD}_{1}\left(10110110\right),{DD}_{1}\left(01100001\right),{DD}_{1}\left(01100011\right),\right. \\
\left.{DD}_{1}\left(11010111\right),{DD}_{1}\left(11010101\right),{DD}_{1}\left(00000010\right)\right\}=\\
=\max \left\{1,1,2,0,1,1\}\right\}=2. \end{align*}

А динамическое расстояния порядка \left(3,2\right) рассчитывается так:

\begin{align*} {DD}_{3,2}\left(S\right)=\max \left\{{DD}_{2}\left({f}_{0}\right),{DD}_{2}\left({f}_{1}\right),{DD}_{2}\left({f}_{2}\right),{DD}_{2}\left({f}_{0}\oplus {f}_{1}\right),\right.\\
\left.{DD}_{2}\left({f}_{0}\oplus {f}_{2}\right),{DD}_{2}\left({f}_{1}\oplus {f}_{2}\right),{DD}_{2}\left({f}_{1}\oplus {f}_{2}\oplus {f}_{3}\right)\right\}= \\
=\max \left\{{DD}_{2}(10110110),{DD}_{2}(11010101),{DD}_{2}(00000010),\right. \\
 \left.{DD}_{2}(10110100)\right\}= \\
= \max \{1,1,2,2,1,1,2\}=2. \end{align*}

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

Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?