Алгоритм безопасного хеширования
Термин SHA ( аббревиатура от английского Secure Hash Algorithm ) обозначает семейство из пяти различных криптографических хэш- функций, разработанных с 1993 года Агентством национальной безопасности (АНБ) и опубликованных NIST в качестве федерального стандарта правительством США ( FIPS PUB 180-4). ).
Как и любой алгоритм хеширования , SHA создает дайджест сообщения фиксированной длины или « отпечаток сообщения » из сообщения переменной длины. Безопасность хеш- алгоритма заключается в том, что функция необратима (то есть невозможно вернуться к исходному сообщению, зная только эти данные) и никогда не должно быть возможности преднамеренно создать два разных сообщения с тот же дайджест . Алгоритмы семейства называются SHA-1 , SHA-224 , SHA-256 , SHA-384 и SHA-512 : последние 4 варианта часто называют SHA-2 , чтобы отличить их от первого. Первый выдает дайджест сообщения длиной всего 160 бит , в то время как другие выдают дайджест длиной в битах, равной числу, указанному в их аббревиатуре (SHA-256 выдает дайджест из 256 бит). SHA-1 является наиболее распространенным алгоритмом семейства SHA и используется во многих приложениях и протоколах, хотя сейчас он небезопасен и вскоре будет заменен другими, более современными и эффективными.
Безопасность SHA-1 была скомпрометирована криптоаналитиками . [1] Хотя атаки на варианты SHA-2 еще не известны, они имеют алгоритм, аналогичный алгоритму SHA-1, поэтому предпринимаются усилия по разработке альтернативных и улучшенных алгоритмов хеширования . [2] [3] Открытый конкурс на реализацию новой функции SHA-3 был объявлен в Федеральном реестре 2 ноября 2007 г. [4] NIST и посредством публичного конкурса , аналогичного принятому для процесса разработки 2 октября 2012 года AES [ 5] объявила алгоритм Кекчака победителем . Таким образом, работа группы итальянских и бельгийских аналитиков Keccak [6] , кажется, обречена на постепенное включение и внедрение в самые разнообразные решения по ИТ-безопасности.
23 февраля 2017 года команда Google объявила о первой практической методике генерации хеш-коллизии . [7] [8]
SHA-0 и SHA-1
Первоначальная спецификация алгоритма была опубликована в 1993 году как Secure Hash Standard , FIPS PUB 180, NIST . Эту версию часто называют SHA-0 , чтобы отличить ее от более поздних версий. Он был отозван АНБ вскоре после публикации и заменен исправленной версией, опубликованной в 1995 году (FIPS PUB 180-1) и обычно известной как SHA-1 . SHA-1 отличается от SHA-0 только однократным чередованием битов в процессе подготовки сообщения его функции одностороннего сжатия; это было сделано, по мнению АНБ, для исправления недостатка исходного алгоритма, снижавшего криптографическую безопасность SHA-0. Однако АНБ не предоставило дополнительных уточняющих объяснений. Впоследствии сообщалось о недостатках как в коде SHA-0, так и в коде SHA-1. SHA-1, по-видимому, обеспечивает большую устойчивость к атакам, подтверждая утверждение АНБ о том, что это изменение повысило безопасность.
SHA-1 (как и SHA-0) создает 160-битный дайджест из сообщения с максимальной длиной 2 64 -1 бит и основан на принципах, аналогичных тем, которые использовал Рональд Л. Ривест из Массачусетского технологического института при разработке Алгоритмы MD4 и MD5 .
Операция
Шаг 1 (заполнение): биты «заполнения» добавляются к исходному сообщению, так что окончательная длина сообщения соответствует 448 по модулю 512, таким образом, если длина «сообщения + заполнение» в битах, деленная на 512, даст остаток 448.
Шаг 2 (Добавить длину): 64-битное целое число без знака, содержащее длину исходного сообщения, добавляется к битовой последовательности (сообщение + заполнение), созданной на шаге 1. В конце этих первых двух шагов мы получаем последовательность битов, кратную 512.
Шаг 3 (инициализация буфера MD): 160-битный буфер, разделенный на 5 регистров по 32 бита каждый, создается для хранения некоторых промежуточных шагов. 5 регистров обычно обозначаются (A, B, C, D, E) и инициализируются следующими шестнадцатеричными значениями:
- А = 67452301
- В = EFCDAB89
- С = 98BADCFE
- Д = 10325476
- Е = C3D2E1F0
Шаг 4 (обработка 512-битных блоков). Битовая последовательность «сообщение + заполнение + длина сообщения» делится на 512-битные блоки, которые мы будем идентифицировать с помощью B n с n в диапазоне от 0 до L. Ядро алгоритма SHA-1 это называется функцией сжатия и состоит из 4 циклов по 20 шагов каждый. Циклы имеют очень похожую структуру друг на друга, за исключением того факта, что они используют другую примитивную логическую функцию. Каждый блок принимается в качестве входного параметра всеми 4-мя циклами вместе с константой K и значениями 5-ти регистров. В конце вычисления мы получим новые значения для A, B, C, D, E, которые мы будем использовать для вычисления следующего блока до конечного блока F.
Набор SHA-2
В 2001 году NIST выпустил четыре дополнительные хеш- функции из семейства SHA, каждая из которых имеет более длинный дайджест , чем исходная, которые вместе именуются SHA-2 (хотя этот термин никогда не был официально стандартизирован). Эти варианты известны, как уже упоминалось, с длиной в битах дайджеста , сгенерированного после официальной аббревиатуры хэша : SHA-224 , SHA-256 , SHA-384 и SHA-512 , с хэшами соответственно 224, 256, 384. и 512 бит. Следует отметить, что последние три алгоритма были формализованы как стандартные в 2002 году, а SHA-224 был представлен в феврале 2004 года: последний имеет хэш такой же длины, что и 2 ключа Triple DES .
Все эти варианты запатентованы правительством США, но публикуются под свободной лицензией. [9] .
Алгоритмы SHA-256 и SHA-512 работают соответственно с 32- и 64-битными словами : они используют разное количество оборотов и дополнительные константы, но их структура практически идентична. Алгоритмы SHA-224 и SHA-384 — это просто усеченные версии двух предыдущих, в которых хэши вычисляются с разными начальными значениями.
Алгоритмы SHA-2, в отличие от SHA-1, не получили большого внимания со стороны сообщества криптоаналитиков, поэтому их криптографическая безопасность не была полностью доказана. Gilbert and Handschuh ( 2003 ) изучили эти новые варианты и не обнаружили уязвимостей [10] .
SHA-3
Конкурс , который привел к выпуску нового стандарта SHA-3 , был официально запущен 2 ноября 2007 г. [4] . 2 октября 2012 года NIST объявил алгоритм Keccak SHA-3 победителем .
Сравнение функций SHA
В таблице ниже приведены основные характеристики алгоритмов семейства SHA ( Внутреннее состояние означает внутреннюю сумму после каждого сжатия блока данных).
| Алгоритм и вариант |
Размер вывода (бит) | Размер внутреннего состояния (бит) | Размер блока (бит) | Максимальный размер сообщения (бит) | Размер слова (бит) | Шаги | Операции | Найдено столкновений | |
|---|---|---|---|---|---|---|---|---|---|
| ША-0 | 160 | 160 | 512 | 2 64 - 1 | 32 | 80 | +, и, или, xor, rotl | Ага | |
| ША-1 | 160 | 160 | 512 | 2 64 - 1 | 32 | 80 | +, и, или, xor, rotl | Атака 2 53 [11] | |
| ША-2 | ША-256/224 | 256/224 | 256 | 512 | 2 64 - 1 | 32 | 64 | +, и, или, xor, шр, ротр | Никто |
| ША-512/384 | 512/384 | 512 | 1024 | 2 128 - 1 | 64 | 80 | +, и, или, xor, шр, ротр | Никто | |
Приложения
SHA-1 является наиболее часто используемым алгоритмом семейства SHA. Он лежит в основе многих приложений и протоколов, включая TLS и SSL , PGP , SSH , S/MIME и IPsec . SHA-1 также используется в системах контроля версий , таких как Git , для определения версии программного обеспечения и в качестве контрольной суммы для проверки целостности больших файлов в онлайн-каталогах.
Алгоритмы SHA также используются в алгоритмах цифровой подписи документов, таких как HMAC , и были взяты за основу для блочных шифров SHACAL .
Примеры и псевдокод
Пример хэша
Это пример дайджеста , сгенерированного SHA-1 (все сообщения закодированы в ASCII ):
SHA1 («Cantami o diva pelide Ахилла, фатальный гнев») = 1f8a690b7366a2323e2d5b045120da7e93896f47
Даже малейшее изменение в сообщении неизбежно приводит к созданию совершенно другого хэша из-за цепной реакции , известной как эффект лавины . Например, заменив Cantamiна Contamiполучим:
SHA1 (« Контами или дива пелиса Ахиллес фатальный гнев») = e5f08d98bf18385e2f26b904cad23c734d530ffb
Дайджест , соответствующий пустой строке:
SHA1 ("")
= da39a3ee5e6b4b0d3255bfef95601890afd80709
Псевдокод SHA-1
Псевдокод алгоритма SHA-1:
Примечания: Все переменные являются 32-битными без знака и переносятся по модулю 2 32 при вычислении .
Инициализировать переменные:
ч0 = 0x67452301
h1 = 0xEFCDAB89
h2 = 0x98BADCFE
h3 = 0x10325476
h4 = 0xC3D2E1F0
Предварительная обработка: добавить бит '1' к сообщению добавить k битов '0', где k — минимальное число ≥ 0, такое, что результирующее сообщение длина (в битах ) соответствует 448 (mod 512 ) добавить длину сообщения (до предварительной обработки) в битах как 64-битное целое число с обратным порядком байтов
Обработайте сообщение в последующих 512-битных фрагментах:
разбить сообщение на 512-битные куски
для каждого куска
разбить фрагмент на шестнадцать 32-битных слов с обратным порядком байтов w [i], 0 <= i <= 15
Расширьте шестнадцать 32-битных слов до восьмидесяти 32-битных слов:
для i от 16 до 79
w [i] = (w [i-3] xor w [i-8] xor w [i-14] xor w [i-16]) повернуть влево 1
Инициализируйте хеш-значение для этого фрагмента:
а = h0
б = h1
с = h2
д = h3
е = h4
Основной цикл:
для i от 0 до 79
, если 0 ≤ i ≤ 19 , то
f = (b и c) или (( не b) и d)
к = 0x5A827999
иначе, если 20 ≤ i ≤ 39
f = b xor c xor d
к = 0x6ED9EBA1
иначе, если 40 ≤ i ≤ 59
f = (b и c) или (b и d) или (c и d)
к = 0x8F1BBCDC
иначе, если 60 ≤ i ≤ 79
f = b xor c xor d
к = 0xCA62C1D6
temp = (a левый поворот 5) + f + e + k + w [i]
е = д
д = с
c = b поворот влево 30
б = а
а = температура
Добавьте хэш этого чанка к результату на данный момент:
h0 = h0 + а
h1 = h1 + b
h2 = h2 + с
h3 = h3 + d
h4 = h4 + е
Вывести окончательное хеш-значение (с прямым порядком байтов):
дайджест = хэш = h0 добавить h1 добавить h2 добавить h3 добавить h4
Следующие формулы могут быть использованы для расчета fв основном цикле, опубликованном выше, вместо оригинальных, опубликованных в официальном документе FIPS PUB 180-1:
(0 ≤ i ≤ 19): f = d xor (b и (c xor d)) (вариант 1) (0 ≤ i ≤ 19): f = (b и c) xor (( не b) и d) ( варианты 2) (0 ≤ i ≤ 19): f = (b и c) + (( не b) и d) (варианты 3) (40 ≤ i ≤ 59): f = (b и c) или (d и (b или c)) (вариант 1) (40 ≤ i ≤ 59): f = (b и c) или (d и (b xor c)) (варианты 2) (40 ≤ i ≤ 59): f = (b и c) + (d и (b xor c)) (варианты 3) (40 ≤ i ≤ 59): f = (b и c) xor (b и d) xor (c и d) (вариант 4)
Псевдокод SHA-256 (вариант SHA-2)
Псевдокод алгоритма SHA-256. Обратите внимание на увеличение смешивания битов слов w[16..63]по сравнению с SHA-1.
Примечания: Все переменные являются 32-битными без знака и переносятся по модулю 2 32 при вычислении .
Инициализировать переменные (первые 32 бита дробных частей квадратных корней первых 8 простых чисел 2..19): ч0: = 0x6a09e667 h1: = 0xbb67ae85 h2: = 0x3c6ef372 h3: = 0xa54ff53a h4: = 0x510e527f h5: = 0x9b05688c h6: = 0x1f83d9ab h7: = 0x5be0cd19
Инициализируем таблицу круглых констант (первые 32 бита дробных частей кубических корней первых 64 простых чисел 2..311): k [0..63]: = 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
Предварительная обработка: добавить бит '1' к сообщению добавить k битов '0', где k — минимальное число> = 0, такое, что результирующее сообщение длина (в битах ) соответствует 448 (mod 512 ) добавить длину сообщения (до предварительной обработки) в битах как 64-битное целое число с обратным порядком байтов
Обработайте сообщение в последующих 512-битных фрагментах:
разбить сообщение на 512-битные куски
для каждого куска
разбить фрагмент на шестнадцать 32-битных слов с обратным порядком байтов w [0..15]
Расширьте шестнадцать 32-битных слов до шестидесяти четырех 32-битных слов:
для i от 16 до 63
s0: = (w [i-15] поворот вправо 7) xor (w [i-15] поворот вправо 18) xor (w [i-15] сдвиг вправо 3)
s1: = (w [i-2] поворот вправо 17) xor (w [i-2] поворот вправо 19) xor (w [i-2] сдвиг вправо 10)
w [i]: = w [i-16] + s0 + w [i-7] + s1
Инициализируйте хеш-значение для этого фрагмента:
а: = h0
б: = h1
с: = h2
д: = h3
е: = h4
ф: = h5
г: = h6
ч: = ч7
Основной цикл:
for i от 0 до 63
s0: = ( правый поворот 2) xor ( правый поворот 13) xor ( правый поворот 22)
maj: = (a и b) xor (a и c) xor (b и c)
t2: = s0 + май
s1: = (e поворот вправо 6) xor (e поворот вправо 11) xor (e поворот вправо 25)
ch: = (e и f) xor (( не e) и g)
t1: = h + s1 + ch + k [i] + w [i]
ч: = г
г: = ф
е: = е
е: = d + t1
д: = с
с: = б
б: = а
а: = t1 + t2
Добавьте хэш этого чанка к результату на данный момент:
h0: = h0 + а
h1: = h1 + b
h2: = h2 + с
h3: = h3 + d
h4: = h4 + e
h5: = h5 + f
h6: = h6 + g
h7: = h7 + h
Получение конечного хеш-значения (обратный порядок байтов):
дайджест = хэш = h0 добавить h1 добавить h2 добавить h3 добавить h4 добавить h5 добавить h6 добавить h7
Функции chи majможно оптимизировать, как описано для функций SHA-1.
SHA-224 идентичен SHA-256, за исключением:
- начальные значения переменных
h0-h7разные и - вывод построен путем опускания
h7.
SHA-512 идентичен по конструкции, но:
- все числа имеют длину 64 бита,
- выполняется 80 шагов вместо 64,
- начальные значения и добавляемые константы расширены до 64 бит и
- количества вращений и перемещений различны .
SHA-384 идентичен SHA-512, за исключением:
- начальные значения
h0-h7разные и - вывод построен путем опускания
h6иh7.
Примечания
- ^ Криптоанализ SHA-1 (Шнайер)
- ^ Шнайер о безопасности: ведение блога NIST Hash Workshop (5)
- ^ The H: Новости безопасности и разработки с открытым исходным кодом
- ^ а б Документ
- ^ Перейти к index.html . Архивировано 5 февраля 2008 г. в Интернет-архиве .
- ^ Семейство губчатых функций Кекчака
- ↑ Объявление о первом столкновении SHA1 на сайте security.googleblog.com , 23 февраля 2017 г. Проверено 17 марта 2017 г.
- ^ Shattered , на shattered.it . _ _ Проверено 17 марта 2017 г. .«Мы взломали SHA-1 на практике».
- ^ Декларация о лицензировании патента США 6829355 .. Проверено 17 февраля 2008 г.
- ^ Анри Гилберт, Хелена Хандшу, Анализ безопасности SHA-256 и сестер , в Конспектах лекций по информатике , Springer, Берлин , ISSN 0302-9743 Проверено 30 января 2008 г. (архивировано из оригинала 18 октября 2011 г.) .
- ^ Блог для dkg — подготовка HOWTO к миграции с SHA-1 в OpenPGP , на debian-administration.org . Проверено 4 мая 2019 г. (архивировано из оригинала 3 мая 2019 г.) .
Библиография
- Флоран Шабо, Антуан Жу: Дифференциальные столкновения в SHA-0. КРИПТО 1998. стр. 56–71.
- Эли Бихам , Рафи Чен, Почти коллизии SHA-0, Cryptology ePrint Archive, Report 2004/146, 2004 (появился на CRYPTO 2004) [1]
- Joux, Carribault, Lemuet, Jalby: Collision для полного алгоритма SHA-0, CRYPTO 2004 [2]
- Xiaoyun Wang , Hongbo Yu и Yiqun Lisa Yin, Efficient Collision Search Attacks on SHA-0, CRYPTO 2005 [3]
- Xiaoyun Wang , Yiqun Lisa Yin и Hongbo Yu, Finding Collision in the Full SHA-1, CRYPTO 2005 [4]
- Анри Гилберт , Хелена Хандшу : Анализ безопасности SHA-256 и Sisters. Избранные области криптографии 2003: стр. 175–193.
- Предлагаемая редакция Федерального стандарта обработки информации (FIPS) 180, Стандарт безопасного хеширования , в Федеральном реестре , том. 59, н. 131, 11 июля 1994 г., с. 35317-35318. Проверено 26 апреля 2007 г. .
Связанные элементы
Внешние ссылки
Сайты хеширования в Интернете
- Хашим всех! - Онлайн хеширование текста и файлов с различными алгоритмами
- Web4Human — онлайн-хеширование с алгоритмами SHA1, SHA224, SHA256 и SHA512.
- https://web.archive.org/web/20071216092901/http://www.johnmaguire.us/tools/hashcalc/index.php — позволяет кодировать строки нулевой длины.
- SHA-1 Lookup — база данных с несколькими миллионами хэшей SHA-1. Реализован как обратный онлайн-поиск.
- Простой хэш-калькулятор на сайте hash.spugesoft.com . Архивировано из оригинала 28 июня 2012 года .
- Текстовый файл SHA-1 строка за строкой — позволяет хешировать sha1 каждую строку текстового файла.
Стандарт: SHA-0, SHA-1, SHA-2, SHA-3...
- Спецификации для стандарта безопасного хеширования (SHS) — проект предлагаемого стандарта SHS (SHA-0)
- Стандарт безопасного хеширования (SHS) — предлагаемый стандарт SHS (SHA-0)
- RFC 3174 , «Алгоритм безопасного хэширования США 1 (SHA-1)»
- RFC 4634 , «Алгоритмы безопасного хеширования в США (SHA и HMAC-SHA)»
- CSRC Cryptographic Toolkit — официальный сайт стандарта безопасного хеширования
NIST .
- FIPS 180-2: Стандарт безопасного хэширования (SHS) ( PDF , 236 КБ) — Текущая версия стандарта безопасного хеширования (SHA-1, SHA-224, SHA-256, SHA-384 и SHA-512), 1 августа 2002 г., изменено 25 февраля 2004 г.
- Безопасное хеширование NIST Страница об алгоритмах хеширования NIST
- Конкурс NIST Cryptographic Hash Project SHA-3
Криптоанализ
- Интервью с Yiqun Lisa Yin об атаке SHA-1 на сайте news.zdnet.com . Проверено 30 января 2008 г. (архивировано из оригинала 16 декабря 2007 г.) .
- Резюме Ленстры о влиянии результатов криптоанализа за февраль 2005 г. ( PDF ) на cm.bell-labs.com . Проверено 30 января 2008 г. (архивировано из оригинала 28 февраля 2008 г.) .
- Объяснение успешных атак на SHA-1 (3 страницы, 2006 г.)
Реализации
- Проект OpenSSL — широко распространенная библиотека OpenSSL включает в себя бесплатное программное обеспечение с открытым исходным кодом с реализацией SHA-1, SHA-224, SHA-256, SHA-384 и SHA-512.
- Crypto++ Crypto++, бесплатная библиотека C++ с криптографическими схемами
- Библиотека Bouncy Castle Библиотека Bouncy Castle — это бесплатная библиотека Java и C#, которая содержит реализации алгоритмов SHA-1, SHA-224, SHA-256, SHA-384 и SHA-512 и других алгоритмов хеширования.
Учебник и образцы кода
- Сравнение функции SHA на разных языках
- Реализации SHA-1 на C и C++, включая двоичные файлы для Win32 и Linux от Paul E. Jones (соавтор RFC)
- Реализация SHA Брайана Гладмана на C
- Реализация Visual Basic SHA-1 Джона Тейлора
- JavaScript-реализация SHA-1 Криса Венесса
- JavaScript-реализация HASH-функций (md4, md5, sha-1, sha-2) , на cryptojs.altervista.org .
Тестовые векторы
Тестовые векторы проекта NESSIE для SHA - 1 , SHA-256 , SHA-384 и SHA-512 .