Русская Википедия:CBC-MAC

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

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

Использовался (с подстановкой в качестве E алгоритма DES) как государственный стандарт США — DAA.

Справочная информация

Файл:CBC-MAC structure (en).svg

Алгоритм CBC MAC является хорошо известным методом для генерации имитовставки (Шаблон:Lang-en — код аутентичности сообщения), основанный на блочном шифре.

Bellare, Kilian и Rogaway доказали безопасность (защищённость) алгоритма при фиксированной длине сообщения в m*n бит, где n — длина базового блочного шифра Е.

Однако, хорошо известно, что CBC MAC не является безопасным, если длина сообщения не является фиксированной. Таким образом, было предложено несколько вариантов алгоритма для варьируемой длины сообщения. Сначала была предложена зашифрованная имитовставка (EMAC), она получается шифрованием CBC MAC значения с помощью E и новым ключом <math>K^2</math>. То есть

<math>EMAC_{K_1,K_2}(M) = E_{K_2}(CBC_{K_1}(M)))</math>,

где M — сообщение, <math>K_1</math> — ключ CBC MAC и <math>CBC_{K_1}(M)</math> — значение CBC MAC сообщения М. Petrank и Rackoff позже доказали, что EMAC защищён, если длина сообщения кратна n (Vaudenay используя декорреляционную теорию, опубликовал другое доказательство). Однако, EMAC требует два ключевых расписания базового блочного шифра E.

Далее Black и Rogaway предложили XCBC, который требует только одного ключевого расписания базового блочного шифра E. XCBC даёт три ключа: один ключ блочного шифра K1, и два ключа по n бит. XCBC описывается следующей схемой

На таблице приведено сравнение длин ключей.

XCBC TMAC OMAC
Длина ключа (k + 2n) бит (k + n) бит k бит

Если <math>\left | M \right | = mn</math> для некоторого m > 0, то XCBC вычисляется в точности, как и CBC MAC, за исключением операции XOR(«исключающее или») ключа <math>K_2</math> (n бит) до шифрования последнего блока.

В противном случае, <math> \ 10^i</math> (где <math> i = n-1-\left | M \right | \mod \ n </math>) добавляется к М и XCBC вычисляется в точности, как и CBC MAC для полученного сообщения. За исключением операции XOR другого ключа <math>K_3</math>(n бит) до шифрования последнего блока. Однако, недостатком XCBC заключается в требовании трёх ключей, то есть в сумме (k + 2n) бит. В итоге, Kurosawa и Iwata предложили двуключевой CBC MAC (TMAC). TMAC принимает два ключа, в сумме (k + n) бит: ключ <math> K_1 </math> блочного шифра и ключ <math> K_2 </math> (n бит). TMAC получается из XCBC перемещением (или заменой) <math> \ (K_2,K_3) </math> на <math> (K_2 \cdot u,K_2) </math>, где u — некоторая ненулевая константа, а «•» обозначает умножение в <math> \ GF(2^n)</math>. Как уже было сказано, OMAC (one-key CBC MAC) принимает только один ключ К блочного шифра Е. Длина ключа, k бит, минимальна, так как базовый шифр должен содержать ключ K, состоящий из k бит в любом случае.

OMAC

OMAC является родительским названием для OMAC1 и OMAC2. OMAC1 получается из XCBC с помощью замены <math> \ (K_2,K_3) </math> на <math> (L \cdot u, L \cdot u^2) </math> для некоторой не равной нулю константе u в <math> \ GF(2^n)</math>, где L — даётся с помощью следующего выражения: <math> L \ = \ EK( 0 ^ n ) </math>. OMAC2 аналогично получается используя <math>(L \cdot u, L \cdot u^{-1})</math>. Мы можем вычислть <math>(L \cdot u)</math>, <math>(L \cdot u^{-1}) </math> и <math> (L \cdot u^2) = \{(L \cdot u) \cdot u\} </math> эффективно одним сдвигом и условием XOR на <math> \ L</math> и <math>(L \cdot u)</math>, соответственно. OMAC1 (соотв. OMAC2) описывается следующей схемой:


1. Если <math> \left | M \right | = mn </math> для некоторого m > 0, тогда OMAC вычисляется в точности, как CBC MAC, за исключением операции XOR для <math> (L \cdot u)</math> до шифрования последнего блока.
2. В противном случае, <math> \ 10^i </math> (где <math> i = n-1-\left | M \right | \mod \ n </math>) добавляется к M и OMAC Вычисляется в точности, как CBC MAC для полученного сообщения М, за исключением операции XOR для <math> (L \cdot u^2)</math>(соотв. <math>(L \cdot u^{-1})</math> до шифрования последнего блока.

Кроме того, в TMAC, ключ <math>K_2</math> является частью ключа, в то время как в OMAC, L не является частью ключа и генерируется из K. Эта сохранность длины ключа делает доказательство безопасности OMAC значительно сложнее чем для TMAC, как показано ниже. На рисунке 2, пусть M[1] = <math>0^n</math>. Тогда L является выходом первого <math>E_K</math>. L всегда появляется снова в последнем блоке. В основном, подобное повторное использование L могло бы привести к тупику в доказательстве безопасности. (В OCB режиме и PMAC, <math> L = EK(0^n)</math> так же используется как ключ универсальной хеш-функции. Однако L появляется как выход некоторого внутреннего блока с незначительной вероятностью.) Тем не менее, мы доказали, что OMAC является таким же защищённым как и XCBC, где анализ безопасности является образцом абсолютной защищённости [1]. Дальнейший OMAC получил все другие положительные свойства, которыми были наделены XCBC (и TMAC). Таким образом, область OMAC — {0,1}, необходимо одноключевое расписание базового блочного шифра E и <math> \max\{1,[\left|M\right|/n]\}</math> блочно-шифровых вызовов(обращений).

Обозначения

Для набора A, x←A означает, что x выбирается из A случайно, причём выбор любого значения из набора А является равновероятным. Если a, b (∈ {0, 1}*) равновеликие строки, тогда a ⊕ b является их побитовой операцией XOR. Если a, b (∈ {0, 1}*) не равновеликие строки, то a ◦ b обозначает их конкатенацию. (Для упрощения далее вводится обозначение: ab:= a ◦ b). Для n-битной строки <math>a = a_{n-1} ... a_1a_0 </math> ∈ {0, 1}*, обозначим <math>a</math> << 1 = <math>a_{n-2}...a_1a_00</math> n-битную строку, которая сдвинута влево на 1 бит, в это же время обозначим a >> 1 = <math>0a_{n-1} ... a_2a_1</math> n-битную строку, которая сдвинута вправо на один бит. Если a ∈ {0, 1}* является строкой, то |a| обозначим её битовую длину. Для любого бита строка a ∈ {0, 1}* такова что |a| ≤ n, положим что
<math> (1) \ pad_n(a) = \begin{cases}

& \ a10^{n-\left| a \right|-1}, \ if \left| a \right|<n,\\ 
& \ a, \ if \left| a \right|= n. 

\end{cases} </math>
Определим <math>\left \| a \right \|_n = max\{1, [\left|a\right|/n]\}</math>, где пустая строка считается как один блок.

CBC MAC

Блочный шифр Е является функцией Е : <math>K_E</math> × <math> \{0, 1\}^n </math> → <math> \{0,1\}^n</math>, где каждое E(K, •) = EK(•) является перестановкой <math>\{0,1\}^n</math>, в свою очередь <math>K_E</math> является набором всевозможных ключей, а n — длина блока. CBC MAC [6, 7] является наипростейшим и наиболее известным алгоритмом для того, чтобы сделать MAC из блочного шифра Е. Пусть сообщение будет иметь вид M = M[1] ◦M[2] ◦ … ◦M[m], где |M[1]| = |M[2]| = … = |M[m]| = n. Тогда CBCK(M), CBC MAC сообщения M при условии ключа K, определяется как Y [m], где Y [i] = EK(M[i] ⊕ Y [i − 1]) для i = 1, … ,m и Y [0] = <math>0^n</math>. Bellare, Kilian и Rogaway доказали безопасность CBC MAC для фиксированной длины сообщения в mn бит.

Поле с <math>2^n</math> точками

Мы вправе рассматривать точку a в <math>GF(2^n)</math> любым из следующих способов: (1) как абстрактная точка в поле а; (2) как n-битную строку <math> a_{n-1} ... a_1a_0</math> ∈ <math>\{0, 1\}^n</math>; (3) как формальный полином <math> a(u) = a_{n-1}u^{n-1}+ ... +a_1u + a_0 </math> с бинарными коэффициентами. Для того, чтобы добавить 2 точки в <math>GF(2^n)</math>, рассмотрим битовую операцию ХOR над ними. Обозначим эту операцию с помощью a ⊕ b. Для того, чтобы перемножить две точки, зафиксируем некоторый полином f(u) с бинарными коэффициентами и степенью n. Для большей точности, выберем лексикографически первым полином среди таких же полиномов степени n имеющий минимальное число коэффициентов. Перечислим некоторые из указанных полиномов
<math> \ f(u) = u^{64} + u^4 + u^3 + u + 1</math> для n = 64,
<math> \ f(u) = u^{128} + u^7 + u^2 + u + 1</math> для n = 128, и
<math> \ f(u) = u^{256} + u^{10} + u^5 + u^2 + 1</math> для n = 256.
Для того, чтобы перемножить две точки a ∈ <math>GF(2^n)</math> и b ∈ <math>GF(2^n)</math>, рассмотрим a и b как полиномы <math>a(u) = a_{n-1}u^{n-1} + ... + a_1u + a_0</math> и <math>b(u) = b_{n-1}u^{n-1} + ... + b_1u + b_0</math>, результат операции c(u), где коэффициенты в GF(2) прибавляются и умножаются, и берётся остаток отделения c(u) на f(u). Кроме того особенно просто умножить точку a ∈ <math> \{0, 1\}^n</math> на u. Например, если n = 128,
<math> (2) \ a \cdot u = \begin{cases}

& \ a\ll 1 \ if \ a_{127} = 0, \\ 
& \ (a\ll 1)\oplus 0^{120}10000111 \ otherwise. 

\end{cases}</math>
Также, просто разделить точку a ∈ <math> \{0, 1\}^n</math> на u, имея в виду, что а умножается на обратную величину u в поле: <math>a \cdot u^{-1}</math>. Например,
<math> (3) \ a \cdot u = \begin{cases}

& \ a\gg 1 \ if \ a_{0} = 0, \\ 
& \ (a\gg 1)\oplus 0^{120}10000111 \ otherwise. 

\end{cases}</math>

Основная конструкция семейства ОМАС

Семейство ОМАС определяется блочным шифром Е : KE × <math> \{0, 1\}^n</math> → <math>\{0, 1\}^n</math>, n-битной константой Cst, универсальной хеш-функцией H : <math> \{0, 1\}^n</math> × X → <math>\{0, 1\}^n</math>, и две уникальных константы <math>Cst_1</math>, <math>Cst_2</math> ∈ X, где X является конечной областью функции H. H, <math>Cst_1</math> и <math>Cst_2</math> должны удовлетворять следующему условию: (константы являются случайными. Запишем HL(•) для H(L, •).


1. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_1</math>) = y не более чем <math> \epsilon_1 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_1</math>.
2. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_2</math>) = y не более чем <math> \epsilon_2 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_2</math>.
3. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_1</math>) ⊕ HL(<math>Cst_2</math>) = y не более чем <math> \epsilon_3 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_3</math>.
4. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_1</math>) ⊕L = y не более чем <math> \epsilon_4 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_4</math>.
5. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_2</math>) ⊕L = y не более чем <math> \epsilon_5 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_5</math>.
6. Для любого y ∈ <math>\{0, 1\}^n</math>, число L ∈ <math>\{0, 1\}^n</math> таково, что HL(<math>Cst_1</math>) ⊕ HL(Cst2) ⊕ L = y не более чем <math> \epsilon_6 \cdot 2^n</math> для некоторого достаточно малого <math> \epsilon_6</math>.

Далее приведём псевдокод, который описывает семейство OMAC.

Algorithm <math>OMAC-family_K(M)</math>
L ← <math>E_K(Cst)</math>;
Y [0] ← <math>0^n</math>;
Partition M into M[1] ... M[m]
for i ← 1 to m − 1 do
X[i] ← M[i] ⊕ Y [i − 1];
Y [i] ← <math>E_K(X[i]</math>);
X[m] ← <math>pad_n(M[m]</math>) ⊕ Y [m − 1];
if |M[m]| = n then X[m] ← X[m] ⊕ <math>H_L(Cst_1)</math>;
else X[m] ← X[m] ⊕ <math>H_L(Cst_2)</math>;
T ← <math>E_K(X[m]</math>);
return T;

Алгоритм семейства ОМАС проиллюстрирован на Рис.3, где <math>pad_n</math>(•) определяется в (1). Пространство ключей К семейства ОМАС: <math>K = K_E</math>. Оно принимает значения ключа K ∈ <math>K_E</math> и сообщение M ∈ {0, 1}*, и возвращает строку из области <math>\{0, 1\}^n</math>.

Предложенная спецификация

В OMAC1 положим Cst = <math>0^n</math>, <math>H_L</math>(x) = L•x, <math>Cst_1</math> = u и <math>Cst_2</math> = <math>u^2</math>, где «•» означает умножение в <math>GF(2^n)</math>. <math>L = E_K(0^n)</math>, <math>H_L(Cst_1) = L \cdot u</math> и <math> H_L(Cst_2) = L \cdot u^2</math> равносильны. OMAC2 аналогичен OMAC1, исключая <math>Cst_2 = u^{-1}</math> вместо <math>Cst_2 = u^2</math>. <math>L = E_K(0^n)</math>, <math>H_L(Cst_1) = L \cdot u</math> и <math>H_L(Cst_2) = L \cdot u^{-1}</math> равносильны. Кроме того, <math>L \cdot u</math>, <math> L \cdot u^{-1}</math> и <math> L \cdot u^2 = (L \cdot u) \cdot u</math> могут быть эффективно вычислены с помощью одного сдвига и одной операции XOR от <math>L</math> и <math>L \cdot u</math>, соответственно как показано в (2) и (3). Легко заметить, что условия в Sec. 3 выполняются для <math> \epsilon_1 = ... = \epsilon_6 = 2-n </math> в OMAC1 и OMAC2. OMAC1 и OMAC2 проиллюстрированы на Рис.2 и описываются следующим образом:
1. Для OMAC1:

Algorithm <math>OMAC1_K(M)</math>
L ← <math>E_K(0^n)</math>;
Y [0] ← <math>0^n</math>;
Partition M into M[1] ... M[m]
for i ← 1 to m − 1 do
X[i] ← M[i] ⊕ Y [i − 1];
if |M[m]| = n
then X[m] ← X[m] ⊕ <math>L \cdot u</math>;
else Y[i] ← E_k(X[i]);
X[m] ← <math>pad_n(M[m]</math>) ⊕ Y [m − 1];
if |M[m]| = n then X[m] ← X[m] ⊕ <math>L \cdot u </math>;
else X[m] ← X[m] ⊕ <math>L \cdot u^2</math>;
T ← <math>E_K(X[m]</math>);
return T;


1. Для OMAC2:

Algorithm <math>OMAC2_K(M)</math>
L ← <math>E_K(0^n)</math>;
Y [0] ← <math>0^n</math>;
Partition M into M[1] ... M[m]
for i ← 1 to m − 1 do
X[i] ← M[i] ⊕ Y [i − 1];
if |M[m]| = n
then X[m] ← X[m] ⊕ <math>L \cdot u</math>;
else Y[i] ← E_k(X[i]);
X[m] ← <math>pad_n(M[m]</math>) ⊕ Y [m − 1];
if |M[m]| = n then X[m] ← X[m] ⊕ <math>L \cdot u </math>;
else X[m] ← X[m] ⊕ <math>L \cdot u^{-1}</math>;
T ← <math>E_K(X[m]</math>);
return T;

Безопасность семейства OMAC

Определение защищённости

Пусть Perm(n) означает набор всех перестановок из <math>\{0, 1\}^n</math>, так же пусть P является случайной перестановкой, если Р — случайная выборка из Perm(n). Безопасность блочного шифра E может быть количественно определена как <math>Adv^{prp}_E(t, q)</math>, максимальное преимущество, которое противник A может получить, когда пытается выделить <math>E_K( \cdot )</math> (со случайно выбранным ключом K) из случайной перестановки P(•), когда допускается вычисление времени t и q запросов (который является либо <math>E_K(\cdot)</math> либо <math>P(\cdot)</math>). Это преимущество определяется следующим образом.
<math>\begin{cases}

& Adv^{prp}_E(A):= \left|Pr(K\overset{R}{\leftarrow}K_E : A^{E_K(\cdot)} = 1) - Pr((K\overset{R}{\leftarrow}Perm(n):A^{P(\cdot)} = 1)\right| \\ 
& Adv_E^{prp}(t,q) := max\{Adv^{prp}_E(A)\}

\end{cases}</math>
Скажем, что блочный шифр E — защищён, если существенно мало. Аналогично, MAC-алгоритм — F : <math>K_F</math> × <math> \{0, 1\}^n</math> → <math>\{0, 1\}^n</math>, где <math>K_F</math> — набор ключей, тогда запишем <math>F_K(\cdot)</math> для F(K, •). Скажем, что противник <math>A^{F_K(\cdot)}</math> взламывает, если A выдаёт <math>(M,F_K(M))</math>, где A никогда не запрашивает M из <math>F_K(\cdot)</math>. Тогда мы определяем преимущество как

<math> \begin{cases}

& Adv^{mac}_E(A):= \Pr(K\overset{R}{\leftarrow}K_F : A^{F_K(\cdot)} forges)  \\ 
& Adv_E^{mac}(t,q,\mu) := max\{Adv^{mac}_F(A)\}

\end{cases} </math>

где максимум берётся по всем противникам, кто «работает» не более времени t, производит не более q запросов, и каждый запрос не более μ бит. Будем говорить, MAC алгоритм защищён (безопасен), если величина пренебрежимо мала. Обозначим Rand(∗, n) набор всех функций из {0, 1}* в <math>\{0, 1\}^n</math>. Этот набор даётся вероятностной мерой в предположении, что случайный элемент R набора Rand(∗, n) связан или ассоциирован с каждой строкой M ∈ {0, 1}* случайной строки R(M)∈<math>\{0, 1\}^n</math>. Далее, мы определим преимущество как
<math> \begin{cases}

& Adv^{viprf}_F(A):= \left|Pr(K\overset{R}{\leftarrow}K_F : A^{F_K(\cdot)} = 1) - Pr((K\overset{R}{\leftarrow}Rand(*,n):A^{R(\cdot)} = 1)\right| \\ 
& Adv_F^{viprf}(t,q,\mu) := max\{Adv^{viprf}_F(A)\}

\end{cases} </math>
где максимум берётся по всем противникам, кто «работает» время не больше t, делает не более q запросов, и каждый запрос не более μ бит. Тогда можно сказать, что MAC алгоритм псевдослучайный, если величина пренебрежимо мала (viprf устанавливается для Variablelength Input PseudoRandom Function — входные псевдо случайные функции переменной длины). Без ограничения общности, как предполагается, противники никогда не делают запросы вне области <math>\{0, 1\}^n</math>, а также никогда не повторяют запросы.

Далее приведём основные теоремы(их формулировки без доказательств).

Lemma 5.1 (Главная Лемма для семейства ОМАС). Предположим, что H, Cst1 и Cst2 удовлетворяют условиям Sec. 3 для некоторых пренебрежимо малых <math> \epsilon_1, ... , \epsilon_6</math>, а также пусть Cst — произвольная n-битная константа. Так же предположим, что случайная перестановка P ∈ Perm(n) используется в семействе OMAC(OMAC-family) как базовый блочный шифр. Пусть A — противник, который делает не более q запросов, и каждый запрос не более nm бит. (m — максимальное число блоков в каждом запросе.) Положим m ≤ 2n/4. Тогда
<math> \left|Pr(P\overset{R}{\leftarrow}Pern(n) : A^{OMAC-family_P(\cdot)} = 1) - Pr((R\overset{R}{\leftarrow}Rand(*,n):A^{R(\cdot)} = 1)\right|\leq \frac{q^2}{2} \cdot (\frac{7m^2+2}{2^n}+3m^2\epsilon )</math>
где <math> \epsilon = max{ \epsilon_1, . . . , \epsilon_6}</math>. Следующие результаты присущи как OMAC1 так и OMAC2. Сначала, мы получили следующую лемму заменой є = 2−n в Lemma 5.1.

Lemma 5.2 (Главная Лемма для семейства ОМАС). Предположим, что случайная перестановка P ∈ Perm(n) используется в OMAC как базовый блочный шифр . Пусть A будет противником, который делает не более q запросов, и каждый запрос не более nm бит. Положим m ≤ 2n/4. Тогда
<math> \left|Pr(P\overset{R}{\leftarrow}Pern(n) : A^{OMAC_P(\cdot)} = 1) - Pr((R\overset{R}{\leftarrow}Rand(*,n):A^{R(\cdot)} = 1)\right|\leq \frac{(5m^2+1)q^2}{2^n} </math>
Далее покажем, что OMAC является псевдослучайным, если базовый блочный шифр Е защищён.

Замечание 5.1. Пусть E : <math>K_E</math> × <math>\{0, 1\}^n</math> → <math>\{0, 1\}^n</math> является базовым блочным шифром, который используется в OMAC. Тогда <math>Adv_{OMAC}^{viprf}(t,q,nm)\leq \frac{(5m^2+1)q^2}{2^n} + Adv_{E}^{prp}(t',q')</math>, где t’ = t + O(mq) and q’ = mq + 1.
В конце покажем, что OMAC защищён как aMAC алгоритм из Замечание 5.1 в обычном смысле. Theorem 5.1. Пусть E : KE × <math>\{0, 1\}^n</math> → <math>\{0, 1\}^n</math> является базовым блочным шифром, используемый в OMAC. Тогда
<math>Adv_{OMAC}^{mac}(t,q,nm)\leq \frac{(5m^2+1)q^2+1}{2^n} + Adv_{E}^{prp}(t',q')</math>,
где t’ = t + O(mq) and q’ = mq + 1.

Аналоги

Большинство технологий построения аутентификационного кода сообщения представляются как хеш-функция от отправленного сообщения и определённого ключа, который знают отправитель и получатель, к ним относятся: RIPE-MAC, IBC-MAC, UMAC, VMAC. Принципиально CBC-MAC отличается от MAC с использованием потокового шифра (с помощью генератора псевдослучайных чисел поток информации разделяется на два потока, которые отправляются отдельно друг от друга), недостатком же является слабые изменения при небольшом изменении сообщения. Также рассмотрим Poly1305-AES, где в качестве ключа используется 128 битный ключ для AES, 106 битный дополнительный код, а также создаётся 128битная псевдослучайная генерация. В качестве недостатка CBC-MAC можно указать меньшую защищённость, а в качестве преимущества — меньшую требовательность к вычислительным ресурсам.

Примечания

Шаблон:Примечания

Литература

Шаблон:Нет сносок