Россия |
Хэш-функции
Сравнение SHA-1 и MD5
Оба алгоритма, SHA-1 и MD5, произошли от MD4, поэтому имеют много общего.
Можно суммировать ключевые различия между алгоритмами.
Таблица 3.2
Сравним алгоритмы MD5 и SHA-1.
- Безопасность: наиболее очевидное и наиболее важное различие состоит в том, что дайджест SHA-1 на 32 бита длиннее, чем дайджест MD5. Если предположить, что оба алгоритма не содержат каких-либо структурированных данных, которые уязвимы для аналитиче-ских атак, то SHA-1 является более стойким алгоритмом. Используя лобовую атаку, труднее создать произвольное сообщение, имеющее данный дайджест, если требуется порядка 2159 операций, как в случае алгоритма SHA-1, чем порядка 2127 операций, как в случае алгоритма MD5. Используя лобовую атаку, труднее создать два сообщения, имеющие одинаковый дайджест, если требуется порядка 280 как в случае алгоритма SHA-1, чем порядка 264 операций как в случае алгоритма MD5.
- Скорость: так как оба алгоритма выполняют сложение по модулю 232, они рассчитаны на 32-битную архитектуру. SHA-1 содержит больше шагов (80 вместо 64) и выполняется на 160-битном буфере по сравнению со 128-битным буфером MD5. Таким образом, SHA-1 должен выполняться приблизительно на 25% медленнее, чем MD5 на той же аппаратуре.
- Простота и компактность: оба алгоритма просты и в описании, и в реализации, не требуют больших программ или подстановочных таблиц. Тем не менее, SHA-1 применяет одношаговую структуру по сравнению с четырьмя структурами, используемыми в MD5. Более того, обработка слов в буфере одинаковая для всех шагов SHA-1, в то время как в MD5 структура слов специфична для каждого шага.
- Архитектуры 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)](/sites/default/files/tex_cache/b1037150b49d04600fc3384b34a32fb1.png)
![Maj (x, y, z) = (x \wedge y) \oplus (x \wedge z) \oplus (y \wedge z)](/sites/default/files/tex_cache/0bcdfee7878de53aa0f6e47896128e68.png)
![\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)](/sites/default/files/tex_cache/71c429c5f2233e1ad24101445a503935.png)
SHA-384 и SHA-512 также используют шесть логических функций, каждая из которых выполняется над 64-битными словами, обозначенными как x, y и z. Результатом каждой функции является 64-битное слово.
![Ch (x, y, z) = (x \wedge y) \oplus (\neg x \wedge z)](/sites/default/files/tex_cache/b1037150b49d04600fc3384b34a32fb1.png)
![Maj (x, y, z) = (x \wedge y) \oplus (x \wedge z) \oplus (y \wedge z)](/sites/default/files/tex_cache/0bcdfee7878de53aa0f6e47896128e68.png)
![\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)](/sites/default/files/tex_cache/b96ec4f6dedf3e41b368089ad49d39e0.png)
Предварительная подготовка сообщения, т.е. добавление определенных битов до целого числа блоков и последующее разбиение на блоки выполняется аналогично тому, как это делалось в 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](/sites/default/files/tex_cache/011da57e801a824e3b3de1d6f401b04f.png)
где 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](/sites/default/files/tex_cache/bd0c36032592e30ab701258bda7bb2b4.png)
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^)](/sites/default/files/tex_cache/945a68ec2e08a776369ba450957d7954.png)
Теперь рассмотрим 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](/sites/default/files/tex_cache/42e02d9ac4846feec54546db33224332.png)
где 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](/sites/default/files/tex_cache/057c2c47a69476b85894fb49b7c0cc69.png)
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^)](/sites/default/files/tex_cache/945a68ec2e08a776369ba450957d7954.png)
Рассмотрим SHA-384. Отличия этого алгоритма от SHA-512:
- Другое начальное значение хэш-кода H(0).
-
384-битный дайджест получается из левых 384 битов оконча-тельного хэш-кода H(N):
H0(N) || H1(N) || H2(N) || H3(N) || H4(N) || H5(N)