Андрей Смирнов
Время чтения: ~19 мин.
Просмотров: 0

Sha-2

Описание Алгоритма[править]

Keccak основан на конструкции Sponge. Это означает, что для получения хеша нужно проделать следующие незамысловатые действия:
Взять исходное сообщение M и дополнить его до длины кратной r. В виде формулы их можно изобразить следующим образом: M=M||0x01||0x00||..||0x00||0x80. То есть к сообщению дописывается единичный байт, необходимое количество нулей и завершается байт со значением 0x80.

UPD: Все вышесказанное справедливо только для случаев, когда добавляется более одного байта.

Однако в случае, если необходимо дополнить всего один байт, то достаточно добавить лишь 0x81.

Затем для каждого блока Mi длиной r бит выполняем:

  • Сложение по модулю 2 с первыми r-битами набора начальных состояний S. Перед началом работы функции все элементы S будут равны нулю.
  • N раз применяем к полученным в результате данным функцию f. Набором начальных состояний S для блока Mi+1 будет результат последнего раунда блока Mi.
  • После того как все блоки Mi закончатся взять итоговый результат и вернуть его в качестве хеш-значения.

Параметры r и cправить

Хеш-функция Keccak реализована таким образом, что функцию перестановки f, применяемую для каждого блока Mi, пользователь может выбирать самостоятельно из набора предопределенных функции b={f-25, f-50, f-100, f-200, f-400, f-800, f-1600}.

Для использования функции f-800, необходимо выбрать такие r и c, чтобы выполнялось равенство r+c=800.

Кроме того, изменяя значения r и c, вы тем самым изменяете количество раундов вашей хеш-функции.

Т.к. количество оных вычисляется по формуле n=12+2l, где 2l=(b/25). Так для b=1600, Количество раундов равно 24.

Однако хотя пользователь в праве выбирать для своей реализации любую из предложенных авторами функций, следует отметить что в качестве стандарта SHA-3 принята только функция Keccak-1600 и авторы всячески рекомендуют пользоваться только ею. Так в качестве основных значений для хешей разной длины авторы выбрали следующие параметры:

  • SHA-224: r=1156, c=448 (вернуть первые 28 байт результат)
  • SHA-256: r=1088, c=512 (вернуть первые 32 байт результат)
  • SHA-384: r=832, c=768 (вернуть первые 48 байт результат)
  • SHA-512: r=576, c=1024 (вернуть первые 64 байт результат)

Remarks

Хэш используется в качестве уникального значения фиксированного размера, представляющего большой объем данных.The hash is used as a unique value of fixed size representing a large amount of data. Хэши двух наборов данных должны совпадать, если соответствующие данные также совпадают.Hashes of two sets of data should match if the corresponding data also matches. Небольшие изменения данных приводят к большим непредсказуемым изменениям в хэш-коде.Small changes to the data result in large, unpredictable changes in the hash.

Размер хеша для алгоритма SHA1 составляет 160 бит.The hash size for the SHA1 algorithm is 160 bits.

Из-за проблем с SHA1 корпорация Майкрософт рекомендует использовать модель безопасности на основе SHA256 или более высокого уровня.Due to collision problems with SHA1, Microsoft recommends a security model based on SHA256 or better.

Описание алгоритма

SHA-1 реализует хеш-функцию, построенную на идее функции сжатия. Входами функции сжатия являются блок сообщения длиной 512 бит и выход предыдущего блока сообщения. Выход представляет собой значение всех хеш-блоков до этого момента. Иными словами хеш блока Mi{\displaystyle M_{i}} равен hi=f(Mi,hi−1){\displaystyle h_i = f(M_i, h_{i-1})}. Хеш-значением всего сообщения является выход последнего блока.

Инициализация

Исходное сообщение разбивается на блоки по 512 бит в каждом. Последний блок дополняется до длины, кратной 512 бит. Сначала добавляется 1 а потом нули, чтобы длина блока стала равной (512 — 64 = 448) бит. В оставшиеся 64 бита записывается длина исходного сообщения в битах. Если последний блок имеет длину более 448, но менее 512 бит, дополнение выполняется следующим образом: сначала добавляется 1, затем нули вплоть до конца 512-битного блока; после этого создается ещё один 512-битный блок, который заполняется вплоть до 448 бит нулями, после чего в оставшиеся 64 бита записывается длина исходного сообщения в битах. Дополнение последнего блока осуществляется всегда, даже если сообщение уже имеет нужную длину.

Инициализируются пять 32-битовых переменных.

A = a = 0x67452301
B = b = 0xEFCDAB89
C = c = 0x98BADCFE
D = d = 0x10325476
E = e = 0xC3D2E1F0

Определяются четыре нелинейные операции и четыре константы.

Ft(m,l,k)=(m∧l)∨(¬m∧k){\displaystyle F_t(m, l, k) = (m \wedge l) \vee (\neg{m} \wedge k)} Kt{\displaystyle K_t} = 0x5A827999 0≤t≤19
Ft(m,l,k)=m⊕l⊕k{\displaystyle F_t(m, l, k) = m \oplus l \oplus k } Kt{\displaystyle K_t} = 0x6ED9EBA1 20≤t≤39
Ft(m,l,k)=(m∧l)∨(m∧k)∨(l∧k){\displaystyle F_t(m, l, k) = (m \wedge l) \vee (m \wedge k) \vee (l \wedge k)} Kt{\displaystyle K_t} = 0x8F1BBCDC 40≤t≤59
Ft(m,l,k)=m⊕l⊕k{\displaystyle F_t(m, l, k) = m \oplus l \oplus k } Kt{\displaystyle K_t} = 0xCA62C1D6 60≤t≤79

Главный цикл

Главный цикл итеративно обрабатывает каждый 512-битный блок. Итерация состоит из четырех этапов по двадцать операций в каждом. Блок сообщения преобразуется из 16 32-битовых слов Mi{\displaystyle M_{i}} в 80 32-битовых слов Wj{\displaystyle W_j} по следующему правилу:

Wt=Mt{\displaystyle W_t  =  M_t }                                      при 0≤t≤15Wt{\displaystyle W_t} = (Wt{\displaystyle W_t}-3⊕{\displaystyle \oplus } Wt{\displaystyle W_t}-8⊕{\displaystyle \oplus } Wt{\displaystyle W_t}-14⊕{\displaystyle \oplus } Wt{\displaystyle W_t}-16) << 1     при 16≤t≤79

здесь << — это циклический сдвиг влево

для t{\displaystyle t} от 0 до 79 temp = (a<<5) + Ft{\displaystyle F_t}(b,c,d) + e + Wt+Kt{\displaystyle W_t + K_t }   
	e = d 
	d = c 
	c = b<<30
	b = a 
	a = temp 

После этого a, b, c, d, e прибавляются к A, B, C , D , E соответственно. Начинается следующая итерация.
Итоговым значением будет объединение пяти 32-битовых слов в одно 160-битное хеш-значение.

Псевдокод SHA-1

Псевдокод алгоритма SHA-1 следующий:

Замечание: Все используемые переменные 32 бита.

Инициализация переменных:
     h0 := 0x6A09E667h0 = 0x67452301
     h1 = 0xEFCDAB89
     h2 = 0x98BADCFE
     h3 = 0x10325476
     h4 = 0xC3D2E1F0

Предварительная обработка:
Присоединяем бит '1' к сообщению
Присоединяем k битов '0', где k наименьшее число ≥ 0 такое, что длина получившегося сообщения (в битах) сравнима по модулю  
    512 с 448 (length mod 512 == 448)
Добавляем длину исходного сообщения (до предварительной обработки) как целое 64-битное Big-endian число, в битах.

В процессе сообщение разбивается последовательно по 512 бит:
for перебираем все такие части
    разбиваем этот кусок на 16 частей, слов по 32-бита w, 0 <= i <= 15

    16 слов по 32-бита дополняются до 80 32-битовых слов:
    for i from 16 to 79
        w = (w xor w xor w xor w) циклический сдвиг 1 

    Инициализация хеш-значений этой части:
        a = h0
        b = h1
        c = h2
        d = h3
        e = h4 

    Основной цикл:
    for i from 0 to 79
        if 0 ≤ i ≤ 19 then
            f = (b and c) or ((not b) and d)
            k = 0x5A827999
        else if 20 ≤ i ≤ 39
            f = b xor c xor d
            k = 0x6ED9EBA1
        else if 40 ≤ i ≤ 59
            f = (b and c) or (b and d) or (c and d)
            k = 0x8F1BBCDC
        else if 60 ≤ i ≤ 79
            f = b xor c xor d
            k = 0xCA62C1D6

        temp = (a leftrotate 5) + f + e + k + w
        e = d
        d = c
        c = b leftrotate 30
        b = a
        a = temp 

    Добавляем хеш-значение этой части к результату:
        h0 = h0 + a
        h1 = h1 + b 
        h2 = h2 + c
        h3 = h3 + d
        h4 = h4 + e 

Итоговое хеш-значение:
digest = hash = h0 append h1 append h2 append h3 append h4 

Вместо оригинальной формулировки FIPS PUB 180-1 приведены следующие эквивалентные выражения и могут быть использованы на компьютере f в главном цикле: 
(0  ≤ i ≤ 19): f = d xor (b and (c xor d))                (альтернатива 1)
(0  ≤ i ≤ 19): f = (b and c) xor ((not b) and d)          (альтернатива 2)
(0  ≤ i ≤ 19): f = (b and c) + ((not b) and d)            (альтернатива 3)
 
(40 ≤ i ≤ 59): f = (b and c) or (d and (b or c))          (альтернатива 1)
(40 ≤ i ≤ 59): f = (b and c) or (d and (b xor c))         (альтернатива 2)
(40 ≤ i ≤ 59): f = (b and c) + (d and (b xor c))          (альтернатива 3)
(40 ≤ i ≤ 59): f = (b and c) xor (b and d) xor (c and d)  (альтернатива 4)

Криптоанализ

Криптоанализ хеш-функций направлен на исследование уязвимости для различного вида атак.
Основные из них:

  • нахождение коллизий — ситуация, когда двум различным исходным сообщениям соответствует одно и то же хеш-значение.
  • нахождение прообраза — исходного сообщения — по его хешу.

При решении методом «грубой силы»:

  • первая задача требует в среднем 2160/2 = 280 операций, если использовать атаку Дней рождения.
  • вторая требует 2160 операций.

От устойчивости хеш-функции к нахождению коллизий зависит безопасность электронной цифровой подписи с использованием данного хеш-алгоритма. От устойчивости к нахождению прообраза зависит безопасность хранения хешей паролей для целей аутентификации.

В январе 2005 года Винсент Рэймен и Elisabeth Oswald опубликовали сообщение об атаке на усечённую версию SHA-1 (53 раунда вместо 80), которая позволяет находить коллизии меньше, чем за 280 операций.

В феврале 2005 года Сяоюнь Ван, Ицюнь Лиза Инь и Хунбо Юй (Xiaoyun Wang, Yiqun Lisa Yin, Hongbo Yu) представили атаку на полноценный SHA-1, которая требует менее 269 операций.

О методе авторы пишут:

Также они заявляют:

Статья с описанием алгоритма была опубликована в августе 2005 года на конференции CRYPTO.

В этой же статье авторы опубликовали атаку на усечённый SHA-1 (58 раундов), которая позволяет находить коллизии за 233 операций.

В августе 2005 года на CRYPTO 2005 эти же специалисты представили улучшенную версию атаки на полноценный SHA-1, с вычислительной сложностью в 263 операций.
В декабре 2007 года детали этого улучшения были проверены Мартином Кохраном.

Кристоф де Каньер и Кристиан Рехберг позже представили усовершенствованную версию атаки на SHA-1, за что были удостоены награды за лучшую статью на конференции ASIACRYPT . Ими была представлена двух-блоковая коллизия на 64-раундовый алгоритм с вычислительной сложностью около 235 операций.

Существует масштабный исследовательский проект, стартовавший в технологическом университете австрийского города Грац, который : «… использует компьютеры, соединенные через Интернет, для проведения исследований в области криптоанализа. Вы можете поучаствовать в проекте загрузив и запустив бесплатную программу на своем компьютере.»

Хотя теоретически SHA-1 считается взломанным (количество вычислительных операций сокращено в 280-63 = 131 072 раза), на практике подобный взлом неосуществим, так как займёт пять миллиардов лет.

Бурт Калински, глава исследовательского отдела в «лаборатории RSA» предсказывает, что первая атака по нахождению прообраза будет успешно осуществлена в ближайшие 5—10 лет.

Ввиду того, что теоретические атаки на SHA-1 оказались успешными, NIST планирует полностью отказаться от использования SHA-1 в цифровых подписях.

Из-за блочной и итеративной структуры алгоритмов, а также отсутствия специальной обработки в конце хеширования, все хеш-функции семейства SHA уязвимы для атак удлинением сообщения и коллизиям при частичном хешировании сообщения. Эти атаки позволяют подделывать сообщения, подписанные только хешем — SHA(message||key){\displaystyle SHA(message||key)} или SHA(key||message){\displaystyle SHA(key||message)} — путём удлинения сообщения и пересчёту хеша без знания значения ключа. Простейшим исправлением, позволяющим защититься от этих атак, является двойное хеширование — SHAd(message)=SHA(SHA(b||message)){\displaystyle SHA_{d}(message)=SHA(SHA(0^{b}||message))} (b{\displaystyle 0^{b}} — блок нулей той же длины, что и блок хеш-функции).

2 ноября 2007 года NIST анонсировало конкурс по разработке нового алгоритма SHA-3, который продлился до 2012 года.

SHAppening

8 октября 2015 Marc Stevens, Pierre Karpman, и Thomas Peyrin опубликовали атаку на функцию сжатия алгоритма SHA 1, которая требует всего 257 вычислений.

Реальный взлом: SHAttered (нахождение коллизий)

23 февраля 2017 года специалисты из и CWI объявили о практическом взломе алгоритма, опубликовав 2 PDF-файла с одинаковой контрольной суммой SHA-1. Это потребовало перебора 9×1018{\displaystyle 9\times 10^{18}} вариантов, что заняло бы 110 лет на 1 GPU.

SHA3-256

Now let’s continue with SHA3-256. SHA3-256 hashing in Java is nothing quite different from SHA-256.

6.2. Apache Commons Codecs

Apache Commons Codecs provides a convenient DigestUtils wrapper for the MessageDigest class. This library began to support SHA3-256 since version 1.11 and it  as well:

6.3. Keccak-256

Keccak-256 is another popular SHA3-256 hashing algorithm. Currently, it serves as an alternative to the standard SHA3-256. Keccak-256 delivers the same security level as the standard SHA3-256, and it differs from SHA3-256 only on the padding rule. It has been used in several blockchain projects, such as Monoro.

Again, we need to import the Bouncy Castle Library to use Keccak-256 hashing:

We can also make use of the Bouncy Castle API to do the hashing:

Особенности протокола SHA-256

Первоначальная версия алгоритма SHA-256 была создана Агентством национальной безопасности США весной 2002 года. Спустя несколько месяцев Национальный метрологический университет опубликовал новоявленный протокол шифрования в принятом на федеральном уровне стандарте безопасной обработки данных FIPS PUB 180-2. Зимой 2004 года он пополнился второй версией алгоритма.

В течение следующих 3 лет АНБ выпустила патент на SHA второго поколения под лицензией Royalty-free. Именно это дало старт применению технологии в гражданских сферах.

Данный протокол работает с информацией, раздробленный на части по 512 бит (или другими словами 64 байта). Он производит ее криптографическое «смешивание», а затем выдаёт 256-битный хеш-код. В состав алгоритма входит сравнительно простой раунд, который повторяется 64 раза.

Кроме того, SHA-256 имеет довольно неплохие технические параметры:

  • Показатель размера блока (байт) – 64.
  • Предельно допустимая длина сообщения (байт) – 33.
  • Характеристика размера дайджеста сообщения (байт) – 32.
  • Стандартный размер слова (байт) – 4.
  • Параметр длины внутреннего положения (байт) – 32.
  • Число итераций в одном цикле – всего 64.
  • Достигаемая протоколом скорость (MiB/s) – примерно 140.

Работа алгоритма SHA-256 базируется на методе построения Меркла-Дамгарда, в соответствии с которым начальный показатель сразу после внесенного изменения разделяется на блоки, а те, в свою очередь, на 16 слов.

Набор данных проходит сквозь цикл, насчитывающий 80 или 64 итерации. Каждый этап характеризуется запуском хеширования из составляющих блок слов. Пара из них обрабатываются инструментарием функции. Далее результаты преобразования складываются, выдав в итоге верный показатель хеш-кода. Для генерации очередного блока используется значение предыдущего. Преобразовывать их отдельно друг от друга не получится.

Также стоит упомянуть 6 битовых операций, на основе которых функционирует протокол:

  • «and» — побитовая операция «И»;
  • «shr» — перемещает значение на требуемое количество бит вправо;
  • «rots» — команда аналогичная по действию предыдущий, с той лишь разницей, что осуществляется циклический сдвиг;
  • «||» или конкатенация — операция соединения частей линейной структуры, чаще всего строк;
  • «xor» — команда, убирающая «ИЛИ»;
  • «+» — обыкновенная операция сложения.

Как можно заметить, довольно типичный для любого алгоритма шифрования набор операций.

Криптоанализ

В 2003 году Гилберт и Хандшух провели исследование SHA-2, но не нашли каких-либо уязвимостей. Однако в марте 2008 года индийские исследователи Сомитра Кумар Санадия и Палаш Саркар опубликовали найденные ими коллизии для 22 итераций SHA-256 и SHA-512. В сентябре того же года они представили метод конструирования коллизий для усечённых вариантов SHA-2 (21 итерация). Позднее были найдены методы конструирования коллизий для 31 итерации SHA-256 и для 27 итераций SHA-512.

Криптоанализ хеш-функции подразумевает исследование устойчивости алгоритма по отношению, по меньшей мере, к следующим видам атак:

  • нахождение коллизий, то есть разных сообщений с одинаковым хешем,
  • нахождение прообраза, то есть неизвестного сообщения по его хешу.

От устойчивости хеш-функции к нахождению коллизий зависит безопасность электронной цифровой подписи с использованием данного хеш-алгоритма. От устойчивости к нахождению прообраза зависит безопасность хранения хешей паролей для целей аутентификации.

Ввиду алгоритмической схожести SHA-2 с SHA-1 и наличия у последней потенциальных уязвимостей принято решение, что SHA-3 будет базироваться на совершенно ином алгоритме. 2 октября 2012 года NIST утвердил в качестве SHA-3 алгоритм Keccak.

Answers to Questions

How to encrypt a character string using SHA256?

SHA256 encryption computes a 256-bit or 32-byte digital fingerprint, whose hexadecimal writing consists of 64 characters. The algorithm uses non-linear functions such as:

$$ \operatorname{Ch}(E,F,G) = (E \wedge F) \oplus (\neg E \wedge G) $$

$$ \operatorname{Ma}(A,B,C) = (A \wedge B) \oplus (A \wedge C) \oplus (B \wedge C) $$

$$ \Sigma_0(A) = (A\!\ggg\!2) \oplus (A\!\ggg\!13) \oplus (A\!\ggg\!22) $$

$$ \Sigma_1(E) = (E\!\ggg\!6) \oplus (E\!\ggg\!11) \oplus (E\!\ggg\!25) $$

and also 64 constants: 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2

Example: dCode has for hash 254cd63ece8595b5c503783d596803f1552e0733d02fe4080b217eadb17711dd

SHA-256 encryption is a hash, which means that it is one-way and can not be decrypted.

How to decrypt SHA256 cipher?

Since SHA256 is a hash based on non-linear functions, there is no decryption method.

dCode uses word databases whose hash has already been calculated (several million potential passwords) and checks if the hash is known. If it is not known or combined with salting the decryption will probably fail.

How to recognize SHA256 ciphertext?

The hash is composed of 64 hexadecimal characters 0123456789abcdef (ie 256 bits)

The SHA256 algorithm is used by blockchain and validation of Bitcoin transactions, any reference is a clue.

Ask a new question

Overview

The SHA (Secure Hash Algorithm) is one of the popular cryptographic hash functions. A cryptographic hash can be used to make a signature for a text or a data file. In this tutorial, let’s have a look how we can perform SHA-256 and SHA3-256 hashing operations using various Java libraries.

The SHA-256 algorithm generates an almost-unique, fixed-size 256-bit (32-byte) hash. This is a one-way function, so the result cannot be decrypted back to the original value.

Currently, SHA-2 hashing is widely used as it is being considered as the most secure hashing algorithm in the cryptographic arena.

SHA-3 is the latest secure hashing standard after SHA-2. Compared to SHA-2, SHA-3 provides a different approach to generate a unique one-way hash, and it can be much faster on some hardware implementations. Similar to SHA-256, SHA3-256 is the 256-bit fixed-length algorithm in SHA-3.

NIST released SHA-3 in 2015, so there are not quite as many SHA-3 libraries as SHA-2 for the time being. It’s not until JDK 9 that SHA-3 algorithms were available in the built-in default providers.

Now, let’s start with SHA-256.

2. MessageDigest Class in Java

Java provides inbuilt MessageDigest class for SHA-256 hashing:

However, here we have to use a custom byte to hex converter to get the hashed value in hexadecimal:

3. Guava Library

The Google Guava library also provides a utility class for hashing.

First, let’s define the dependency:

Now, here’s how we can use Guava to hash a String:

4. Apache Commons Codecs

Similarly, we can also use Apache Commons Codecs as well:

Here’s the utility class – called DigestUtils – that supports SHA-256 hashing:

5. Bouncy Castle Library

5.2. Hashing Using the Bouncy Castle Library

The Bouncy Castle API provides a utility class for converting hex data to bytes and back again.

However, it is required to populate a digest using the built-in Java API first:

6. SHA3-256

Now let’s continue with SHA3-256. SHA3-256 hashing in Java is nothing quite different from SHA-256.

6.2. Apache Commons Codecs

Apache Commons Codecs provides a convenient DigestUtils wrapper for the MessageDigest class. This library began to support SHA3-256 since version 1.11 and it  as well:

6.3. Keccak-256

Keccak-256 is another popular SHA3-256 hashing algorithm. Currently, it serves as an alternative to the standard SHA3-256. Keccak-256 delivers the same security level as the standard SHA3-256, and it differs from SHA3-256 only on the padding rule. It has been used in several blockchain projects, such as Monoro.

Again, we need to import the Bouncy Castle Library to use Keccak-256 hashing:

We can also make use of the Bouncy Castle API to do the hashing:

7. Conclusion

In this quick article, we had a look at few ways of implementing SHA-256 and SHA3-256 hashing in Java, using both built-in and third-party libraries.

The source code of the examples above can be found on the GitHub project.

Сравнение SHA-1 с другими алгоритмами

Сравнение с MD5

И MD5, и SHA-1 являются, по сути, улучшенными продолжениями MD4.

Сходства:

  1. Четыре этапа.
  2. Каждое действие прибавляется к ранее полученному результату.
  3. Размер блока обработки, равный 512 бит.
  4. Оба алгоритма выполняют сложение по модулю 232, они рассчитаны на 32-битную архитектуру.

Различия:

  1. В SHA-1 на четвёртом этапе используется та же функция f, что и на втором этапе.
  2. В MD5 в каждом действии используется уникальная прибавляемая константа. В SHA-1 константы используются повторно для каждой из четырёх групп.
  3. В SHA-1 добавлена пятая переменная.
  4. SHA-1 использует циклический код исправления ошибок.
  5. В MD5 четыре сдвига, используемые на каждом этапе, отличаются от значений, используемых на предыдущих этапах. В SHA на каждом этапе используется постоянное значение сдвига.
  6. В MD5 четыре различных элементарных логических функции, в SHA-1 — три.
  7. В MD5 длина дайджеста составляет 128 бит, в SHA-1 — 160 бит.
  8. SHA-1 содержит больше раундов (80 вместо 64) и выполняется на 160-битном буфере по сравнению со 128-битным буфером MD5. Таким образом, SHA-1 должен выполняться приблизительно на 25 % медленнее, чем MD5 на той же аппаратуре.

Брюс Шнайер делает следующий вывод : «SHA-1 — это MD4 с добавлением расширяющего преобразования, дополнительного этапа и улучшенным лавинным эффектом. MD5 — это MD4 с улучшенным битовым хешированием, дополнительным этапом и улучшенным лавинным эффектом.»

Сравнение с ГОСТ Р 34.11-94

Ряд отличительных особенностей ГОСТ Р 34.11-94:

  1. При обработке блоков используются преобразования по алгоритму ГОСТ 28147—89;
  2. Обрабатывается блок длиной 256 бит, и выходное значение тоже имеет длину 256 бит.
  3. Применены меры борьбы против поиска коллизий, основанном на неполноте последнего блока.
  4. Обработка блоков происходит по алгоритму шифрования ГОСТ 28147—89, который содержит преобразования на S-блоках, что существенно осложняет применение метода дифференциального криптоанализа к поиску коллизий алгоритма ГОСТ Р 34.11-94. Это существенный плюс по сравнению с SHA-1.
  5. Теоретическая криптостойкость ГОСТ Р 34.11-94 равна 2128, что во много раз превосходит 280для SHA-1.

Сравнение с другими SHA

В таблице, «промежуточный размер хеша» означает «размер внутренней хеш-суммы» после каждой итерации.

Вариации алгоритмаРазмер выходного хеша (бит)Промежуточный размер хеша (бит)Размер блока (бит)Максимальная длина входного сообщения (бит)Размер слова (бит)Количество раундовИспользуемые операцииНайденные коллизии
SHA-0160160512264 − 13280+,and, or, xor, rotlЕсть
SHA-1160160512264 − 13280+,and, or, xor, rotl252 операций
SHA-2SHA-256/224256/224256512264 − 13264+,and, or, xor, shr, rotrНет
SHA-512/384512/38451210242128 − 16480+,and, or, xor, shr, rotrНет
Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации