From 14ba71d9e77e449888e85c4c5e14c4d93ad11dbf Mon Sep 17 00:00:00 2001
From: Andrew Guschin <guschin.drew@gmail.com>
Date: Fri, 5 May 2023 15:05:42 +0400
Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B?=
 =?UTF-8?q?=20=D0=BB=D0=B5=D0=BA=D1=86=D0=B8=D0=B8=2026=20=D0=B8=2028?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 cryptography/lectures/lecture26.tex | 170 ++++++++++++++++++++++++++++++++++++
 1 file changed, 170 insertions(+)
 create mode 100644 cryptography/lectures/lecture26.tex

(limited to 'cryptography/lectures/lecture26.tex')

diff --git a/cryptography/lectures/lecture26.tex b/cryptography/lectures/lecture26.tex
new file mode 100644
index 0000000..0aa81f0
--- /dev/null
+++ b/cryptography/lectures/lecture26.tex
@@ -0,0 +1,170 @@
+% Лекция 25 (21.04.23)
+
+% TODO: УБРАТЬ ИЗ СЛОВАРЯ КОНКАТЕНЦИЮ
+Стартовый вектор хэширования длины 128 бит представляет собой конкатенацию
+четырёх констант: $01234557 \| 89abcdef \| fedcba98 \| 76543210$. При вычислении
+используется накопитель, содержащий четыре 32-разрядных слова A, B, C, D.
+Исходным заполнением накопителя являются слова стартового вектора хэширования.
+
+Обработка 16-словного блока $M_i$, $1 \leq i \leq n$, осуществляется за четыре
+цикла, каждый из которых включает в себя 16 шагов.
+
+На каждом шаге $j$-го цикла, $1 \leq j \leq 4$, выполняются операции:
+\begin{align*}
+  t &:= B + (A + f_j(B, C, D) + M_i[z[i]] + y[i]), \\
+  (A, B, C, D) &:= (D, B + t \lll s[i], B, C).
+\end{align*}
+где $M_i[z[i]]$ --- слово, выбранное из $M_i$ в соответствии с перестановкой
+$z$; $X \lll k$ --- циклический сдвиг слова $X$ влево на $k$ бит; <<+>> ---
+операция сложения по модулю $2^{32}$.
+
+Таким образом, на каждом шаге выполняются четыре операции сложения и одна
+операция сдвига, вычисляется значение одной цикловой функции.
+
+Выходом каждой итерации является конкатенация текущих значений четырёх слов
+накопителя.
+
+После обработки блока $M_n$ итоговым сжатым образом аргумента будет
+128-разрядная строка из четырёх слов: $A \| B \| C \| D$.
+
+Поскольку нелинейнойсть операции $f_i$ мала, нелинейные свойства итогового
+преобразования определяются влиянием переносов при сложении.
+
+Хэш-функция MD5 считается небезопасной и желательно отказаться от её
+использования.
+
+
+\paragraph{SHA.}
+
+Защищённый алгоритм хэширования (Secure Hash Algorithm --- SHA) разработан
+Управлением национальной безопасности США (National Security Agency --- NSA)
+и стандартизирован институтом NIST в 1995 году.
+
+Первая версия этого алгоритма называлась просто SHA (теперь её часто называют
+SHA0) и имела весьма существенный недостаток. В NSA обнаружили этот недостаток
+и разработали метод его исправления. Это было опубликовано NIST в качестве
+улучшенной версии алгоритма SHA под названием SHA1. Тем не менее NIST не привёл
+никаких сведений о найденном недостатке.
+
+Через три года два французских исследователя Шабо и Жу опубликовали статью
+о слабом месте алгоритма SHA0. Эта ошибка была исправлена в алгоритме SHA1,
+поэтому можно предположить, что речь идёт именно о том загадочном недостатке,
+который был обнаружен NSA.
+
+SHA1 --- это 160-битовая функция хэширования, основанная на алгоритме MD4.
+Функция SHA1 использует 160-битовое промежуточное состояние, которое разбивается
+на пять 32-битовых слов. Как и MD5, она состоит из четырёх раундов, представляющих
+собой комбинацию элементарных операций над 32-битовыми словами.
+
+Вместо того чтобы обрабатывать каждый блок сообщения по четыре раза, SHA1
+использует линейную рекуррентную функцию, чтобы <<растянуть>> 16 слов блока
+сообщения до нужных ей 80 слов.
+
+Это обобщение метода, используемого в MD4. В MD5 каждый бит сообщения
+используется функцией перемешивания по четыре раза. В SHA1 наличие линейной
+рекуррентной функции гарантирует, что каждый бит сообщения используется
+функцией перемешивания по меньшей мере 10 раз.
+
+Что интересно, единственным отличием SHA1 от SHA0 стало добавление к линейной
+рекуррентной функции циклического сдвига на один бит.
+
+Сегодня подбор серверного ключа аутентификации SHA1, то есть \emph{коллизия с
+выбранным префиксом} (данная методика позволяет для любых сообщений $x$ и $y$
+найти такие последовательности $q_1$ и $q_2$, что $H(x \| q_1) = H(y \| q_2)$),
+на арендованном кластере GPU обойдётся в \$45 тыс.
+
+Это делает атаку доступной не только для государственных спецслужб, но и для
+коммерческих клиентов, поэтому список пользователей SHA1 становится меньше. SHA1
+считается уязвимым и содержащим дефекты в алгоритме и рекомендуется перейти на
+более надёжные альтернативы.
+
+Хеш-функции SHA2 была разработана Агентством национальной безопасности США и
+опубликована Национальным институтом стандартов и технологий (NIST) в качестве
+стандарта FIPS PUB 180-2 в августе 2002 года. В этот стандарт также вошла
+хеш-функция SHA1.
+
+SHA2 имеет четыре варианта: SHA-256, SHA-384 и SHA-512, которые называются в
+соответствии с количеством битов в выходных данных.
+
+D 2007 году был объявлен конкурс на новый стандарт криптографических функций
+хэширования США SHA3.
+
+
+\paragraph{Стандарт ГОСТ Р 34.11-2012}
+
+Первый отечественный стандарт хэш-функции был принят в 1994 году. Это ГОСТ
+Р 34.11-94, в котором определена хэш-функция $h : \set{0, 1}^* \to \set{0,
+1}^{256}$
+
+В 2012 году российский стандарт хэш-функции стандарт хэш-функции был
+модифицирован Центром защиты информации и специальной связи ФСБ России при
+участии ОАО <<ИнфоТеКС>> (<<Информационные технологии и коммуникационные
+системы>>) и приказом Федерального агентства по техническому регулированию
+и метрологии от 7 августа 2012 г. №216-ст новый стандарт ГОСТ Р 34.11-2012
+<<Информационная технология. Криптографическая защита информации. Функция
+хэширования>> был введён в действие с 1 января 2013 года.
+
+Необходимость разработки настоящего стандарта вызвана потребностью в создании
+хэш-функции, соответствующей современным требованиям к криптографической
+стойкости и требованиям стандарта ГОСТ Р 34.10-2012 на электронную цифровую
+подпись.
+
+Данный стандарт определяет две функции хэширования $h : \set{0, 1}^* \to
+\set{0, 1}^n$ с длинами хэш-кода $n = 256$ бит и $n = 512$ бит.
+
+Неофициальные названия: <<Стрибог-256>> и <<Стрибог-512>>.
+
+\begin{enumerate}
+  \item
+    \textbf{Значение параметров.}
+
+    \begin{enumerate}
+      \item
+        Значение инициализационного вектора IV для функции хэширования с длиной
+        хэш-кода 512 бит равно $0^{512}$, для функции хэширования с длиной
+        хэш-кода 256 равно $(00000001)^{64}$.
+      \item
+        Нелинейное биективное преобразование множества двоичных векторов
+        $\set{0, 1}^8$ задаётся подстановкой $\pi = \fn{Vec}_8 \pi' \fn{Int}_8 :
+        \set{0, 1}^8 \to \set{0, 1}^8$, где $\pi' : Z_{2^8} \to Z_{2^8}$.
+        Значение подстановки $\pi'$ заданы в стандарте в виде массива
+        $\pi' = (\pi'(0), \pi'(1), \dots, \pi'(255))$, в котором в определённом
+        порядке записаны числа от 0 до 255. Например, $\pi'(22) = 153$.
+      \item
+        Значение перестановки $\tau \in S_{64}$ записаны в стандарте в виде
+        массива $\tau = (\tau(0), \tau(1), \dots, \tau(63))$, в котором в
+        определённом порядке записаны числа от 0 до 63. Например, $\tau(22) =
+        50$.
+      \item
+        Линейное преобразование $l$ множества двоичных векторов $\set{0,
+        1}^{64}$ задаётся умножением справа на матрицу $A$ над полем $GF(2)$,
+        строки которой заданы в стандарте последовательно в шестнадцатеричном
+        виде. Например, 22 строка матрицы $A = 8a174a9ec8121e5d$.
+      \item
+        Итерационные константы $C_i$, $i = 1, \dots, 12$, записаны в стандарте
+        в шестнадцатеричном виде. Значение константы, записанное в виде
+        $a_{127} \dots a_0$, где $a_i \in \Z_{16},\, i = 0, \dots, 127$, есть
+        $\fn{Vec}_4(a_{127}) \| \dots \| \fn{Vec}_4(a_0)$.
+    \end{enumerate}
+
+  \item
+    \textbf{Преобразования.}
+
+    % TODO: дописать
+    \begin{enumerate}
+      \item
+        $X[k] : \set{0, 1}^{512} \to \set{0, 1}^{512}, X[k](a) = k \oplus a,\,
+        k, a \in \set{0, 1}^{512}$.
+      \item
+        $S : \set{0, 1}^{512} \to \set{0, 1}^{512},\, S(a) = S(a_{64} \| \dots \|
+        a_0) = \pi(a_{63}) \| \dots \| \pi(a_0)$, где $a \in \set{0, 1}^{512},
+        a_i \in \set{0, 1}^8$, $i = 0, \dots, 63$.
+      \item
+        $P : \set{0, 1}^{512} \to \set{0, 1}^{512},\, P(a) = P(a_{63} \| \dots \|
+        a_0) = a_{t(63)} \| \dots \| a_{\tau(0)}$, где $a \in \set{0, 1}^{512},
+        a_i \in \set{0, 1}^8$, $i = 0, \dots, 63$.
+      \item
+        $L : \set{0, 1}^{512} \to \set{0, 1}^{512},\, L(a) = L(a_7 \| \dots \|
+        a_0) = l(a_7) \| \dots \| l(a_0)$, где $a \in \set{0, 1}^{512}, a_i \in$
+    \end{enumerate}
+\end{enumerate}
-- 
cgit v1.2.3

