ГОСТ Р 34.11-94

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск
Криптографическая хеш-функция
Название ГОСТ Р34.11-94
Разработчик ГУБС ФАПСИ и ВНИИС
Создан 1994
Опубликован Январь 1995
Размер хеша 256 бит
Число раундов 1
Тип хеш-функция

ГОСТ Р34.11-94 — российский криптографический стандарт вычисления хэш-функции.

  • Дата введения: 01 января 1995 г.
  • Размер хэша: 256 бит
  • Размер блока входных данных: 256 бит
  • Разработчик: ГУБС ФАПСИ и ВНИИС

Стандарт определяет алгоритм и процедуру вычисления хэш-функции для последовательности символов.

Содержание

[править] Вводные обозначения

Для описания алгоритма хэширования будем использовать следующие обозначения:

  • \mathcal{f}0\mathcal{g}^j — блок длиной j бит заполненный нулями.
  • \mathcal{j}M\mathcal{j} — длина блока M в битах по модулю 2256.
  • \mathcal{k} — слияние (конкатенация) двух блоков в один.
  • + — сложение двух блоков длиной 256 бит по модулю 2256
  • \oplus — побитное сложение двух блоков одинаковой длины (то есть функцию xor).

Далее будем считать, что младший (нулевой) бит в блоке находится справа старший слева.

[править] Описание

Основой описываемой хэш-функции является шаговая функция хэширования H_{out}\ =\ f(H_{in}, m) где Hout, Hin, m — блоки длины 256 бит.

Входное сообщение M разделяется на блоки mn,mn − 1,mn − 2,...,m1 по 256 бит. В случае если размер последнего блока mn меньше 256 бит, то к нему приписываются слева нули для достижения заданной длины блока.

Каждый блок сообщения, начиная с первого, подаётся на шаговую функцию для вычисления промежуточного значения хэш-функции:
\!H_{i+1}=f(H_{i}, m_{i})
Значение H1 можно выбрать произвольным.

После вычисления Hn + 1 конечное значение хэш-функции получают следующим образом:

  • H_{n+2}\ =\ f(H_{n+1},\ L), где L — Длина сообщения M в битах по модулю 2256
  • h\ =\ f(H_{n+2},\ K), где K — Контрольная сумма сообщения M: m1 + m2 + m3 + ... + mn

h — значение хэш-функции сообщения M

Файл:Вычисление хэш-функции.GIF

Алгоритм:

  1. Инициализация:
    1. h\ := initial — Начальное значение хэш-функции. Т.е. - 256 битовый IV вектор, определяется пользователем.
    2. \Sigma\ :=\ 0 — Контрольная сумма
    3. L\ :=\ 0 — Длина сообщения
  2. Функция сжатия внутренних итераций: для i = 1 … n — 1 выполняем следующее (пока | M | > 256):
    1. h\ :=\ H(h,\ m_i) - итерация метода последовательного хэширования
    2. L\ :=\ L\ +\ 256 - итерация вычисления длины сообщения
    3. \Sigma\ :=\ \Sigma\ \oplus\ m_i - итерация вычисления контрольной суммы
  3. Функция сжатия финальной итерации:
    1. L\ :=\ L\ +\ \mathcal{j}\ m_n\ \mathcal{j} - вычисление полной длины сообщения
    2. m_n\ :=\ {0}^{256\ -\ \mathcal{j} m_n \mathcal{j}} \mathcal{k} m_n - набивка последнего блока
    3. \Sigma\ :=\ \Sigma\ \oplus\ m_n - вычисление контрольной суммы сообщения
    4. h\ :=\ H(h,\ m_n)
    5. h\ :=\ H(h,\ L) - MD - усиление
    6. h\ :=\ H(h,\ \Sigma)
  4. Выход. Значением хэш-функции является h

Замечание: так как длина сообщения участвует в хэшировании, то нет необходимости указывать в передаваемом сообщении количество добавленных нулей к блоку mn.

[править] Алгоритм вычисления шаговой функции хэширования

Шаговая функция хэширования H отображает два блока длиной 256 бит в один блок длиной 256 бит: H_{out}\ =\ f(H_{in},\ m) и состоит из трех частей:

  • Генерирование ключей K_1,\ K_2,\ K_3,\ K_4
  • Шифрующее преобразование — шифрование \ H_{in} с использованием ключей K_1,\ K_2,\ K_3,\ K_4
  • Перемешивающее преобразование результата шифрования

[править] Генерация ключей

В алгоритме генерации ключей используются:

  • Два преобразования блоков длины 256 бит:
    • Преобразование A(Y)=A(y_4\ \mathcal{k}\ y_3\ \mathcal{k}\ y_2\ \mathcal{k}\ y_1) = (y_1 \oplus y_2)\ \mathcal{k}\ y_4\ \mathcal{k}\ y_3\ \mathcal{k}\ y_2, где y_1,\ y_2,\ y_3,\ y_4 — подблоки блока Y длины 64 бит.
    • Преобразование P(Y) = P(y_{32} \mathcal{k} y_{31} \mathcal{k} \dots \mathcal{k} y_1) = y_{\varphi(32)} \mathcal{k} y_{\varphi(31)} \mathcal{k} \dots \mathcal{k} y_{\varphi(1)}, где \varphi (i + 1 + 4(k - 1))= 8i + k,\ i = 0, \dots, 3,\ k = 1, \dots, 8, а y_{32},\ y_{31},\ \dots,\ y_{1} — подблоки блока Y длины 8 бит.
  • Три константы:
C2 = 0
C3 = 0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ffff00ff00ff00ff00
C4 = 0

Алгоритм:

  1. U\ :=\ H_{in},\quad V\ :=\ m,\quad W\ :=\ U\ \oplus\ V,\quad K_1\ =\ P(W)
  2. Для j = 2,3,4 выполняем следующее:
    U := A(U) \oplus C_j,\quad V := A(A(V)),\quad W := U \oplus V,\quad K_j = P(W)

[править] Шифрующее преобразование

После генерирования ключей происходит шифрование Hin по ГОСТ 28147—89 в режиме простой замены на ключах Ki (для i: = 1,2,3,4), процедуру шифрования обозначим через E (Примечание: функция шифрования E по ГОСТ 28147 шифрует 64 битные данные 256 битным ключом). Для шифрования Hin разделяют на четыре блока по 64 бита: H_{in} = h_4 \mathcal{k} h_3 \mathcal{k} h_2 \mathcal{k} h_1 и зашифровывают каждый из блоков:

  • s1 = E(h1,K1)
  • s2 = E(h2,K2)
  • s3 = E(h3,K3)
  • s4 = E(h4,K4)

После чего блоки собирают в 256 битный блок: S = s_4 \mathcal{k} s_3 \mathcal{k} s_2 \mathcal{k} s_1

[править] Перемешивающее преобразование

На последнем этапе происходит перемешивание Hin, S и m с применением регистра сдвига, в результате чего получают Hout.

Для описания процесса преобразования сначала необходимо определить функцию ψ, которая производит элементарное преобразование блока длиной 256 бит в блок той же длины:  \psi(Y) = \psi(y_{16} \mathcal{k} y_{15} \mathcal{k} ... \mathcal{k} y_2 \mathcal{k} y_1) = (y_1 \oplus y_2 \oplus y_3  \oplus y_4 \oplus y_{13} \oplus y_{16}) \mathcal{k} y_{16} \mathcal{k} y_{15} \mathcal{k} ... \mathcal{k} y_3 \mathcal{k} y_2, где y16,y15,...,y2,y1 — подблоки блока Y длины 16 бит.

Файл:Функция ψ.gif

Перемешивающее преобразование имеет вид H_{out} = {\psi}^{61}(H_{in} \oplus \psi(m \oplus {\psi}^{12}(S))) , где ψi означает i-ую степень преобразования ψ. Другими словами преобразование ψ представляет собой LFSR — линейный сдвиговый регистр с обратной связью, а индекс i указывает на количество раундов LFSR.

Файл:Перемешивающее преобразование.gif

[править] Ряд отличительных особенностей ГОСТ Р 34.11-94

  • При обработке блоков используются преобразования по алгоритму ГОСТ 28147—89;
  • Обрабатывается блок длиной 256 бит, и выходное значение тоже имеет длину 256 бит.
  • Применены меры борьбы против поиска коллизий, основанном на неполноте последнего блока.
  • Обработка блоков происходит по алгоритму шифрования ГОСТ 28147—89, который содержит преобразования на S — боксах, что существенно осложняет применение метода дифференциального криптоанализа к поиску коллизий.

[править] Оценка криптостойкости

В 2008 году командой экспертов из Австрии и Польши была обнаружена техническая уязвимость, сокращающая поиск коллизий в 223 раз.[1] Количество операций, необходимое для нахождения коллизии, таким образом, составляет 2105, что, однако, на данный момент практически не реализуемо. Проведение коллизионной атаки на практике имеет смысл только в случае цифровой подписи документов, причём если взломщик может изменять неподписанный оригинал.

[править] Использование

Функция используется при реализации систем цифровой подписи на базе асимметричного криптоалгоритма по стандарту ГОСТ Р 34.10-2001. Сообщество российских разработчиков СКЗИ согласовала используемые в Интернет параметры ГОСТ Р 34.11-94, см. RFC 4357.

[править] Примеры хэшей

В качестве шифрующего преобразования преобразования в приводимых ниже примерах используется алгоритм ГОСТ 28147-89 в режиме простой замены. При этом заполнение узлов замены (S-box) следующее:

Номер S-box Значение
1 4 10 9 2 13 8 0 14 6 11 1 12 7 15 5 3
2 14 11 4 12 6 13 15 10 2 3 8 1 0 7 5 9
3 5 8 1 13 10 3 4 2 14 15 12 7 6 0 9 11
4 7 13 10 1 0 8 9 15 14 4 6 12 11 2 5 3
5 6 12 7 1 5 15 13 8 4 10 9 14 0 3 11 2
6 4 11 10 0 7 2 1 13 3 6 8 5 9 12 15 14
7 13 11 4 1 3 15 5 9 0 10 14 7 6 8 2 12
8 1 15 13 0 5 7 10 4 9 2 3 14 6 11 8 12

В качестве стартового вектора взято нулевое значение, то есть

H1=0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000.

[править] Подробный пример из описания стандарта

 M = 0x73657479622032333D6874676E656C202C6567617373656D2073692073696854

Т.к. длина сообщения равна 256 битам, то нет необходимости дописывать нули. Вычисляем ~H_{2} = f(H_{1}, M):

  • Генерация ключей
K1=0x733D2C20 65686573 74746769 79676120 626E7373 20657369 326C6568 33206D54
K2=0x110C733D 0D166568 130E7474 06417967 1D00626E 161A2065 090D326C 4D393320
K3=0x80B111F3 730DF216 850013F1 C7E1F941 620C1DFF 3ABAE91A 3FA109F2 F513B239
K4=0xA0E2804E FF1B73F2 ECE27A00 E7B8C7E1 EE1D620C AC0CC5BA A804C05E A18B0AEC
  • Шифрующее преобразование
S1=0x42ABBCCE 32BC0B1B
S2=0x5203EBC8 5D9BCFFD
S3=0x8D345899 00FF0E28
S4=0xE7860419 0D2A562D
S =0xE7860419 0D2A562D 8D345899 00FF0E28 5203EBC8 5D9BCFFD 42ABBCCE 32BC0B1B
  • Перемешивающее преобразование
H2=0xCF9A8C65 ?35967A4 68A03B8C 42DE7624 D99C4124 883DA687 561C7DE3 3315C034

Вычисляем ~H_{3} = f(H_{2}, L):

L = 0x00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100
  • Генерация ключей
K1=0xCF68D956 9AA09C1C 8C3B417D 658C24E3 50428833 59DE3D15 6776A6C1 A4248734
K2=0x8FCF68D9 809AAC9C 3C8C3B41 C7658C24 BB504288 2859DE3D 666676A6 B3A42487
K3=0x4E70CF97 3C8065A0 853C8CC4 57389A8C CABB50BD E3D7A6DE D1936788 6CB35B24
K4=0x584E70CF C53C8065 48853C8C 1657389A EDCABB50 78E3D7A6 EED19867 7F5CB35B
  • Шифрующее преобразование
S =0x66B70F5E F163F461 468A9528 61D60593 E5EC8A37 3FD42279 3CD1602D DD783E86
  • Перемешивающее преобразование
H3=0x2B6EC233 C7BC89E4 2ABC2692 5FEA7285 DD3848D1 C6AC997 24F74E2B 09A3AEF7

Вычисляем ~H_{4} = f(H_{3}, \Sigma\ ):

 \Sigma\  = 0x73657479622032333D6874676E656C202C6567617373656D2073692073696854
  • Генерация ключей
K1=0x5817F104 0BD45D84 B6522F27 4AF5B00B A531B57A 9C8FDFCA BB1EFCC6 D7A517A3
K2=0xE82759E0 C278D95E 15CC523C FC72EBB6 D2C73DA8 19A6CAC9 3E8440F5 C0DDB66A
K3=0x77483AD9 F7C29CAA EB06D1D7 641BCAD3 FBC3DAA0 7CB555F0 D4968080 0A9E56BC
K4=0xA1157965 2D9FBC9C 088C7CC2 46FB3DD2 7681ADCB FA4ACA06 53EFF7D7 C0748708
  • Шифрующее преобразование
S =0x2AEBFA76 A85FB57D 6F164DE9 2951A581 C31E7435 4930FD05 1F8A4942 550A582D
  • Перемешивающее преобразование
H4=0xFAFF37A6 15A81669 1CFF3EF8 B68CA247 E09525F3 9F811983 2EB81975 D366C4B1

Таким образом, результат хэширования:

H = 0xFAFF37A6 15A81669 1CFF3EF8 B68CA247 E09525F3 9F811983 2EB81975 D366C4B1

[править] Другие примеры

M = 0x7365747962203035203D206874676E656C20736168206567617373656D206C616E696769726F206568742065736F70707553
H = 0x0852F5623B89DD57AEB4781FE54DF14EEAFBC1350613763A0D770AA657BA1A47
M = ""
H = 0xBD298BCFCAFB398D76E3FC8FA0951679D6B57BD782AC7Bf13C03C6848A351D89
M = "ГОСТ Р 34.11-94"
H = 0xB6A83547677B534FEDB3C68BC7207129F7454928554CF2847DD7E30165F1CF30
M = "The quick brown fox jumps over the lazy dog"
H = 0x94421F6D370FA1D16BA7AC5E31296529C968047DCA9BF4258AC59A0C41FAB777

Малейшее изменение сообщения в подавляющем большинстве случаев приводит к совершенно другому хэшу вследствие лавинного эффекта. К примеру, при изменении dog на cog получится:

M = "The quick brown fox jumps over the lazy cog"
H = 0x45C4EE4EE1D25091312135540D6702E6677F7A73B5DA31E10B8BB7AADAC4EBA3

[править] Примечания

  1. European cryptologists attack hash functions(англ.)
  2. Leontiev, S., Ed. and D. Shefanovskij, Ed. Using the GOST R 34.10-94, GOST R 34.10-2001 and GOST R 34.11-94 Algorithms with the Internet X.509 Public Key Infrastructure Certificate and CRL Profile (англ.) (May 2006). — RFC 4491. Проверено 12 июня 2009.
  3. Leontiev, S., Ed. and G. Chudov, Ed. Using the GOST 28147-89, GOST R 34.11-94, GOST R 34.10-94, and GOST R 34.10-2001 Algorithms with Cryptographic Message Syntax (CMS) (англ.) (May 2006). — RFC 4490. Проверено 12 июня 2009.
  4. Leontiev, S., Ed. and G. Chudov, Ed. GOST 28147-89 Cipher Suites for Transport Layer Security (TLS) (англ.) (December 2008). — Internet-Drafts, work in progress. Проверено 12 июня 2009.
  5. S. Leontiev, P. Smirnov, A. Chelpanov Using GOST 28147-89, GOST R 34.10-2001, and GOST R 34.11-94 Algorithms for XML Security (англ.) (December 2008). — Internet-Drafts, work in progress. Проверено 12 июня 2009.
  6. V.Dolmatov, Ed. Use of GOST signature algorithms in DNSKEY and RRSIG Resource Records for DNSSEC (англ.) (April 2009). — Internet-Drafts, work in progress. Проверено 12 июня 2009.

[править] Ссылки

На других языках