Московский государственный университет имени М.В.Ломоносова
Опубликован: 28.11.2014 | Доступ: свободный | Студентов: 1392 / 127 | Длительность: 23:26:00
ISBN: 978-5-9556-0163-2
Лекция 3:

Хэш-функции

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >

Сравнение SHA-1 и MD5

Оба алгоритма, SHA-1 и MD5, произошли от MD4, поэтому имеют много общего.

Можно суммировать ключевые различия между алгоритмами.

Таблица 3.2


Сравним алгоритмы MD5 и SHA-1.

  1. Безопасность: наиболее очевидное и наиболее важное различие состоит в том, что дайджест SHA-1 на 32 бита длиннее, чем дайджест MD5. Если предположить, что оба алгоритма не содержат каких-либо структурированных данных, которые уязвимы для аналитиче-ских атак, то SHA-1 является более стойким алгоритмом. Используя лобовую атаку, труднее создать произвольное сообщение, имеющее данный дайджест, если требуется порядка 2159 операций, как в случае алгоритма SHA-1, чем порядка 2127 операций, как в случае алгоритма MD5. Используя лобовую атаку, труднее создать два сообщения, имеющие одинаковый дайджест, если требуется порядка 280 как в случае алгоритма SHA-1, чем порядка 264 операций как в случае алгоритма MD5.
  2. Скорость: так как оба алгоритма выполняют сложение по модулю 232, они рассчитаны на 32-битную архитектуру. SHA-1 содержит больше шагов (80 вместо 64) и выполняется на 160-битном буфере по сравнению со 128-битным буфером MD5. Таким образом, SHA-1 должен выполняться приблизительно на 25% медленнее, чем MD5 на той же аппаратуре.
  3. Простота и компактность: оба алгоритма просты и в описании, и в реализации, не требуют больших программ или подстановочных таблиц. Тем не менее, SHA-1 применяет одношаговую структуру по сравнению с четырьмя структурами, используемыми в MD5. Более того, обработка слов в буфере одинаковая для всех шагов SHA-1, в то время как в MD5 структура слов специфична для каждого шага.
  4. Архитектуры little-endian и big-endian: MD5 использует little-endian схему для интерпретации сообщения как последовательности 32-битных слов, в то время как SHA-1 задействует схему big-endian. Каких-либо преимуществ в этих подходах не существует.

Хэш-функции SHA-2

В 2001 году NIST принял в качестве стандарта три хэш-функции с су-щественно большей длиной хэш-кода. Часто эти хэш-функции называют SHA-2 или SHA-256, SHA-384 и SHA-512 (соответственно, в названии ука-зывается длина создаваемого ими хэш-кода). Эти алгоритмы отличаются не только длиной создаваемого хэш-кода, но и длиной обрабатываемого блока, длиной слова и используемыми внутренними функциями. Сравним характеристики этих хэш-функций.

Таблица 3.3


Под безопасностью здесь понимается стойкость к атакам типа "парадокса дня рождения".

В SHA-256 размер блока сообщения m = 512, в SHA-384 и SHA-512 размер блока сообщения m = 1024. Каждый алгоритм оперирует с w-битными словами. Для SHA-256 w = 32, для SHA-384 и SHA-512 w = 64. В алгоритмах используются обычные булевские операции словами, а также сложение по модулю 2w, правый сдвиг на n бит SHRn(x), где х – w-битное слово, и циклические (ротационные) правый и левый сдвиги на n бит ROTRn(x)и ROTLn(x), где х – w-битное слово.

SHA-256 использует шесть логических функций, при этом каждая из них выполняется с 32-битными словами, обозначенными как x, y и z. Результатом каждой функции тоже является 32-битное слово.

Ch (x, y, z) = (x \wedge y) \oplus (\neg x \wedge z)
Maj (x, y, z)	= (x \wedge y) \oplus (x \wedge z) \oplus (y \wedge z)
\sum _0^\left{ ^2^5^6^ \right} (x) = ROTR2 (x) \oplus ROTR13 (x) \oplus ROTR22 (x) \\
\sum _1^\left{^2^5^6^\right} (x) = ROTR^6 (x) \oplus ROTR^1^1 (x) \oplus ROTR^2^5 (x) \\
\sigma_0^\left{^2^5^6^\right} (x) = ROTR^7 (x) \oplus ROTR^1^8 (x) \oplus SHR^3 (x) \\
\sigma_1^\left{^2^5^6^\right} (x)= ROTR^1^7 (x) \oplus ROTR^1^9 (x) \oplus SHR^1^0 (x)

SHA-384 и SHA-512 также используют шесть логических функций, каждая из которых выполняется над 64-битными словами, обозначенными как x, y и z. Результатом каждой функции является 64-битное слово.

Ch (x, y, z) = (x \wedge y) \oplus (\neg x \wedge z)
Maj (x, y, z)	= (x \wedge y) \oplus (x \wedge z) \oplus (y \wedge z)
\sum _0^\left{ ^5^1^2^ \right} (x) = ROTR^2^8 (x) \oplus ROTR^3^4 (x) \oplus ROTR^3^9 (x) \\
\sum _1^\left{ ^5^1^2^ \right} (x) = ROTR^1^4 (x) \oplus ROTR^1^8 (x) \oplus ROTR^4^1 (x) \\
\sigma_0^\left{ ^5^1^2^ \right} (x) = ROTR^1 (x) \oplus ROTR^1^8 (x) \oplus SHR^7 (x) \\
\sigma_1^\left{ ^5^1^2^ \right} (x)= ROTR^1^9 (x) \oplus ROTR^6^1 (x) \oplus SHR^6 (x)

Предварительная подготовка сообщения, т.е. добавление определенных битов до целого числа блоков и последующее разбиение на блоки выполняется аналогично тому, как это делалось в SHA-1 (конечно, с учетом длины блока каждой хэш-функции). После этого каждое сообщение можно представить в виде последовательности N блоков M(1), M(2), …, M(N).

Рассмотрим SHA-256. В этом случае инициализируются восемь 32-битных переменных, которые после выполнения преобразования над очередным блоком будут являться промежуточным значением хэш-кода:

a, b, c, d, e, f, g, h

Основой алгоритма является модуль, состоящий из 64 циклических обработок каждого блока M(i):

T_1= h + \sum_1^ \lbrace ^2^5^6^ \rbrace(e) + Ch (e, f, g) + K_t\sum_0^ \lbrace ^2^5^6^ \rbrace+ W_t \\
T_2= \sum_0^ \lbrace ^2^5^6^ \rbrace (a) + Maj (a, b, c) \\
h= g\\
g= f\\
f = e\\
e = d + T_1\\
d = c\\
c = b\\
b = a\\
a = T_1+ T_2

где Ki{256} – шестьдесят четыре 32-битных константы, каждая из которых является первыми 32-мя битами дробной части кубических корней первых 64 простых чисел.

Wt вычисляются из очередного блока сообщения по следующим прави-лам:

W_t= M_t^(^i^)\quad	0 \le t \le15 \\
W_t= s_1^ \lbrace ^2^5^6^ \rbrace (W_t_-_2) + W_t_-_7 + s_0^ \lbrace ^2^5^6^ \rbrace (W_t_-_1_5) + W_t_-_1_6 \quad 16\le t\le 63

i-ое промежуточное значение хэш-кода H(t) вычисляется следующим образом:

H_0^(^i^)= a + H_0^(^i^-^1^)\\
H_1^(^i^)= b + H_1^(^i^-^1^)\\
H_2^(^i^)= c + H_2^(^i^-^1^)\\
H_3^(^i^)= d + H_3^(^i^-^1^)\\
H_4^(^i^)= e + H_4^(^i^-^1^)\\
H_5^(^i^)= f + H_5^(^i^-^1^)\\
H_6^(^i^)= g + H_6^(^i^-^1^)\\
H_7^(^i^)= h + H_7^(^i^-^1^)

Теперь рассмотрим SHA-512. В данном случае инициализируются во-семь 64-битных переменных, которые будут являться промежуточным зна-чением хэш-кода:

a, b, c, d, e, f, g, h

Основой алгоритма является модуль, состоящий из 80 циклических обрабо-ток каждого блока M(i):

T_1= h+ \sum_1^ \lbrace ^5^1^2^ \rbrace(e) + Ch (e, f, g) + K_t^ \lbrace ^5^1^2^ \rbrace + W_t\\
T_2= \sum_0^ \lbrace ^5^1^2^ \rbrace(a) + Maj (a, b, c)\\
h = g\\
g = f\\
f = e\\
e = d +T_1\\
d = c\\
c = b\\
b = a
a = T_1 + T_2

где Ki{512} – восемьдесят 64-битных констант, каждая из которых является первыми 64-мя битами дробной части кубических корней первых восьми-десяти простых чисел.

Wt вычисляются из очередного блока сообщения по следующим формулам:

W_t = M_t^(^i^) \quad 0 \le t \le 15\\
W_t= \sigma_1^ \lbrace ^5^1^2^ \rbrace(W_t_-_2)+ W_t_-_7 + \sigma_0^\lbrace ^5^1^2^ \rbrace(W_t_-_1_5) + W_t_-_1_6 \quad 16 \le t \le 79

i-ое промежуточное значение хэш-кода H(t) вычисляется следующим образом:

H_0^(^i^)= a + H_0^(^i^-^1^)\\
H_1^(^i^)= b + H_1^(^i^-^1^)\\
H_2^(^i^)= c + H_2^(^i^-^1^)\\
H_3^(^i^)= d + H_3^(^i^-^1^)\\
H_4^(^i^)= e + H_4^(^i^-^1^)\\
H_5^(^i^)= f + H_5^(^i^-^1^)\\
H_6^(^i^)= g + H_6^(^i^-^1^)\\
H_7^(^i^)= h + H_7^(^i^-^1^)

Рассмотрим SHA-384. Отличия этого алгоритма от SHA-512:

  1. Другое начальное значение хэш-кода H(0).
  2. 384-битный дайджест получается из левых 384 битов оконча-тельного хэш-кода H(N):

    H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N)

< Лекция 2 || Лекция 3: 123456 || Лекция 4 >