SHA-2 Algorithms¶
SHA-2 (Secure Hash Algorithm 2) is a set of cryptographic hash functions defined in RFC 6234: US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF).
The SHA-2 family consists of six hash functions with digests (hash values) that are 224, 256, 384 or 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.
This library supports all of the algorithms mentioned above.
Implementation on FPGA¶
The internal structure of SHA-2 algorithms can be shown as the figure below:
As we can see from the figure, the SHA-2 hash calculation can be partitioned into two main parts.
- The pre-processing part pads or splits the input message into fixed sized blocks, and informs the down-stream parts that how many blocks do we have in this message. The message word size is 32-bit for SHA-224/SHA-256, 64-bit for the rest 4 algorithms, and each block has a size of 16 message words.
- The digest part iteratively computes the hash values. Loop-carried dependency is enforced by the algorithm, and thus this part cannot reach II=1.
As these two parts can work independently, they are designed into parallel dataflow process, connected by streams (FIFOs).
The dup_strm module is used to duplicate the number of block stream, and generateMsgSchedule module is responsible for generating the message word stream in sequence.
Performance¶
SHA-224 and SHA-256¶
As SHA-224 is simply truncated SHA-256 with different initialization values, and they share the same internal structure, as illustrated in the figure above.
A single instance of SHA-256/SHA-224 function processes input message at the rate of 512 bit / 68 cycles at 330.25MHz/314.36MHz respectively.
The hardware resource utilizations of SHA-224 is listed in tab1SHA224 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 7806 | 4976 | 1121 | 0 | 3.028 |
The hardware resource utilizations of SHA-256 is listed in tab1SHA256 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 7806 | 4973 | 1176 | 0 | 3.181 |
SHA-384, SHA-512, SHA-512/224, and SHA-512/256¶
As SHA-384 and SHA-512/t is simply truncated SHA-512 with different initialization values, they share the same internal structure, as illustrated in the figure above.
A single instance of one of SHA-384/SHA-512/SHA512-224/SHA512-256 processes input message at the rate of 1024 bit / 84 cycles at 313.28MHz/323.31MHz/310.26MHz/313.57MHz.
The hardware resource utilizations of SHA-384 is listed in tab1SHA384 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 15494 | 8317 | 2045 | 0 | 3.192 |
The hardware resource utilizations of SHA-512 is listed in tab1SHA512 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 15497 | 8318 | 2015 | 0 | 3.093 |
The hardware resource utilizations of SHA-512/224 is listed in tab1SHA512224 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 15498 | 8318 | 2101 | 0 | 3.223 |
The hardware resource utilizations of SHA-512/256 is listed in tab1SHA512256 below:
| BRAM | DSP | FF | LUT | CLB | SRL | clock period(ns) |
| 0 | 0 | 15497 | 8322 | 2029 | 0 | 3.189 |
Clustering¶
To boost the throughput of SHA-2 primitives, multiple instance can be organized into a cluster, and offer message level parallelism.
MD5, SHA-1 и SHA-2. Какой алгоритм хэширования самый безопасный и как их проверить
Хэш-функция принимает входное значение, например, строку данных, и возвращает какое-то значение фиксированной длины. Идеальная хэш-функция должна обладать следующими свойствами:
- она должна быть очень быстрой;
- она должна иметь возможность возвращать огромный диапазон хэш-значений;
- она должна генерировать уникальный хэш для каждого входного значения (без коллизий);
- она должна генерировать различные хэш-значения для одинаковых входных значений;
- сгенерированные ей хэш-значения не должны иметь ярко выраженной закономерности в своем распределении.
Разумеется, идеальных хэш-функций не бывает, однако каждая хэш-функция максимально старается приблизится к идеалу. Учитывая тот факт, что большинство хэш-функций возвращают значения фиксированной длины и из-за этого диапазон значений ограничен, в принципе это ограничение можно игнорировать. Например, количество возможных значений, которые может вернуть 256-битная хэш-функция, соразмерно количеству атомов во Вселенной.
В идеале хэш-функция должна работать без коллизий, иными словами ни одна пара различных входных значений не должна генерировать одно и то же значение хэш-функции. Это является важным условием особенно для криптографических хэш-функций, поскольку коллизии хэшей рассматриваются как уязвимости.
И наконец, хэш-функция должна генерировать различные хэш-значения для любого входного значения без возможности их прогнозирования. Например, возьмем следующие два очень похожих предложения:
А теперь сравним хэш-значения MD5, сгенерированные для каждого предложения:
Для двух похожих предложений были сгенерированы два мало похожих хэша. Такое свойство является полезным как для проверки, так и для криптографии. Это и есть закон распределения: хэш-значения всех входных данных должны быть равномерно распределены без возможности прогнозирования по всему диапазону возможных хэш-значений.
Популярные хэш-функции
Существует несколько широко используемых хэш-функций. Все они были разработаны математиками и программистами. В процессе их дальнейшего изучения было выявлено, что некоторые из них имеют недостатки, однако все они считаются приемлемыми для не криптографических приложений.
Хэш-функция MD5 генерирует 128-битное хэш-значение. Изначально она была разработана для использования в криптографии, однако со временем в ней были обнаружены уязвимости, вследствие чего для этой цели она больше не подходит. И тем не менее, она по-прежнему используется для разбиения базы данных и вычисления контрольных сумм для проверки передачи файлов.
SHA расшифровывается как Secure Hash Algorithm. SHA-1 – это первая версия алгоритма, за которой в дальнейшем последовала SHA-2.
В то время как MD5 генерирует 128-битный хэш, SHA-1 создает 160-битный (20 байт). Если представить это число в шестнадцатеричном формате, то это целое число длиной в 40 символов. Подобно MD5, этот алгоритм был разработан для криптографических приложений, но вскоре в нем также были найдены уязвимости. На сегодняшний день он считается более устойчивым к атакам в сравнении с MD5.
Вторая версия алгоритма, SHA-2, имеет множество разновидностей. Пожалуй, наиболее часто используемая – SHA-256, которую Национальный институт стандартов и технологий (NIST) рекомендует использовать вместо MD5 и SHA-1.
Алгоритм SHA-256 возвращает 256-битное хэш-значение, что представляет собой шестнадцатеричное значение из 64 символов. Хоть это и не самый идеальный вариант, то текущие исследования показывают, что этот алгоритм значительно превосходит в безопасности MD5 и SHA-1.
Если рассматривать этот алгоритм с точки зрения производительности, то вычисление хэша с его помощью происходит на 20-30% медленнее, чем с использованием MD5 или SHA-1.
Этот алгоритм хэширования был разработан в конце 2015 года и до сих пор еще не получил широкого применения. Этот алгоритм не имеет отношения к тому, что использовался его предшественником, SHA-2.
Алгоритм SHA3-256 – это алгоритм с эквивалентной применимостью более раннего алгоритма SHA-256, причем вычисления первого алгоритма занимают немного больше времени, чем вычисления второго.
Использование хэш-значений для проверки
Как правило, хэш-функции используются для проверки правильности передачи данных. Одним из таких применений является проверка сжатых коллекций файлов, таких как архивные файлы .zip или .tar .
Имея архив и его ожидаемое хэш-значение (обычно называемое контрольной суммой), можно выполнить собственное вычисление хэш-функции, чтобы убедиться в целостности полученного вами архива.
Например, можно сгенерировать контрольную сумму MD5 для tar-файла в Unix, используя следующие команды:
Чтобы получить хэш MD5 для файла в Windows, используйте команду PowerShell Get-FileHash:
Сгенерированную контрольную сумму можно разместить на сайте загрузки рядом со ссылкой на скачивание архива. Получатель, скачав архив, может проверить правильность его получения, выполнив следующую команду:
где 2e87284d245c2aae1c74fa4c50a74c77 — сгенерированная контрольная сумма, которая была размещена. При успешном выполнении вышеуказанной команды появится статус OK, как показано ниже:
Что такое хеш?

Алгоритм хеширования — это математическая функция, которая сокращает данные до фиксированного размера. Так, например, если бы мы взяли предложение «Быстрая Коричневая Лиса Прыгает Через Ленивую Собаку» И прогнали его через специальный алгоритм хеширования, известный как CRC32, мы бы получили следующий результат: «07606bb6». Этот результат называется хеш или хеш-значением. Иногда хеширование называют односторонним шифрованием. Хеш удобен, когда компьютеру нужно идентифицировать, сравнивать или иными способами выполнять вычисления в файлах и строках данных. Компьютеру проще сначала вычислить хеш, а затем сравнить значение, нежели сравнивать исходные файлы.
Одним из ключевых свойств алгоритмов хеширования является детерминизм. Любой компьютер в мире, который понимает алгоритм хеширования, который вы выберете, может локально вычислить хеш предложения из нашего примера и получить тот же самый ответ. Алгоритмы хеширования используются всевозможными способами – они используются для хранения паролей, в базах данных и т.д. Существуют сотни алгоритмов хеширования и все они имеют конкретные цели – некоторые из них оптимизированы для определенных типов данных, другие для обеспечения высокой скорости, третьи – безопасности и т.д. В сегодняшнем разборе нас интересует только SHA алгоритм. SHA расшифровывается как Защитный алгоритм хеширования – его название уже говорит само за себя – он используется для криптографической защиты. Криптографические хеш-алгоритмы производят необратимые и уникальные хеши. Необратимость состоит в том, что, если бы у вас был только хеш, вы не смогли бы его использовать, чтобы выяснить, каков был исходный фрагмент данных, поэтому исходные данные остаются безопасными и неизвестными. Уникальность означает, что две разных части данных никогда не могут превратиться в один и тот же хеш – в следующем разделе объясним, почему это так важно.
Примечание: чтобы было легче читать и понимать эту статью, мы используем примеры в виде строк данных и алгоритмов хеширования, которые значительно короче, чем то, что на самом деле используется на практике. Хеши, которые вы видели в этой статье, не являются хешами SHA любого типа.
Цифровые подписи
Теперь, когда мы знаем, что такое хеш, мы можем объяснить, как он используется в SSL-сертификатах. Протокол SSL/TLS используется для обеспечения безопасной передачи данных с одного устройства на другое через Интернет. Для краткости создается впечатление, что SSL часто понимается, как шифрование. Однако не забывайте, что SSL обеспечивает также аутентификацию. В файле сертификата SSL задается необходимая информация, которая необходима для аутентификации. Или, другими словами, SSL-сертификаты связывают определенный открытый ключ с идентификатором. Запомните, что SSL/TLS протокол способствует соединению с использованием асимметричного шифрования. Это означает, что есть два ключа шифрования, каждый из которых обрабатывает половину процесса: открытый ключ для шифрования и закрытый для дешифровки. Каждый сертификат SSL содержит открытый ключ, который может использоваться для шифрования данных клиентом, а владелец указанного SSL-сертификата надежно хранит закрытый ключ на своем сервере, который они используют для дешифрования данных и делает их доступными для чтения. В конечном счете, основной целью асимметричного шифрования является безопасный обмен ключами.

Асимметричные ключи требуют большой вычислительной мощности, поэтому они также используют (и все еще безопасно) небольшие симметричные ключи для фактической части соединения. Таким образом, клиент генерирует сеансовый ключ, шифрует его копию и отправляет ее на сервер, где он может быть расшифрован и использован для связи в течение всего времени соединения (или до его поворота). Именно поэтому аутентификация невероятно важна для обеспечения того, чтобы SSL/TLS фактически обеспечивал значимую безопасность. Представьте, что ваш компьютер не имел бы надежного способа узнать, кому принадлежит ключ шифрования, который вы использовали?
Шифрование ключа сеанса с помощью такого ключа не будет полезным, потому как вы не знаете, кто владеет соответствующим закрытым ключом, который его расшифрует. В конце концов, шифрование данных малопригодно, если вы отправляете его непосредственно злоумышленнику, посреднику злоумышленника на другом конце провода.
Цифровые подписи являются важной частью того, как SSL-сертификаты предоставляют аутентификацию. Когда выдается сертификат, он подписывается цифровой подписью центром сертификации (CA), выбранным вами в качестве поставщика сертификатов (например, Sectigo, Thawte, Geotrust и т.д.). Эта подпись обеспечивает криптографическое доказательство того, что центр сертификации подписал сертификат SSL, что сертификат не был изменен или воспроизведен. Что еще более важно, подлинная подпись является криптографическим доказательством того, что информация, содержащаяся в сертификате, была проверена доверенной третьей стороной.
Теперь давайте поговорим о том, как цифровая подпись создается, применяется, прикрепляется – выберите удобную терминологию. Асимметричные ключи, о которых мы упоминали ранее, используются снова, но с целью подписи не зашифрованных данных. Математически подписание включает в себя просмотр того, как объединяются данные и ключи (мы не будем заходить слишком далеко в дебри по поводу того, как создаются подписи, потому что они быстро усложняются. Если вас это интересует, Джошуа Дэвис написал отличную статью о том, как работают цифровые подписи). Чтобы упростить работу компьютеров, но все же надежно создать и проверить эти подписи, центр сертификации сначала хеширует файл сертификата и подписывает полученный хеш. Это более эффективно, чем подписание всего сертификата. Эти цифровые подписи затем предоставляют необходимое доказательство того, что предоставленный вам сертификат является достоверным сертификатом, выданным доверенным центром сертификации на соответствующий веб-сайт. Никаких трюков. Никакой имитации. Никаких манипуляций с файлом сертификата SSL/TLS не происходит. Цифровые подписи невероятно чувствительны — любое изменение файла приведет к изменению подписи.
Если бы мы взяли наш пример из предыдущего раздела и сделали его полностью строчным («быстрая коричневая лиса прыгает через ленивую собаку»), получившийся хеш был бы совсем другим. Это означает, что итоговая подпись этого хеша также будет отличаться. Даже изменение одного бита многотысячного гигабайтного документа приведет к совершенно другому хешу. Это делает невозможным для злоумышленников изменение законного сертификата или создание мошеннического сертификата, который выглядит законным. Другой хеш означает, что подпись больше недействительна, и ваш компьютер узнает об этом, когда аутентифицирует сертификат SSL. Если на вашем компьютере обнаружена недопустимая подпись, это приведет к ошибке и полностью предотвратит небезопасное соединение.
SHA-1 и SHA-2

Теперь, когда нами заложенфундамент ваших знаний, можем переходить к звезде сегодняшнего шоу. Как уже говорилось выше, SHA – это защитный алгоритм хеширования. SHA-1 и SHA-2 – это две разные версии этого алгоритма. Они различаются в конструкциях (как создается хеш из исходных данных) и в битовой длине подписи. Вам следует воспринимать SHA-2, как преемника SHA-1. В первую очередь, люди сосредоточены на бит-длине, как на важном различии. SHA-1 — это 160-битный хеш. SHA-2, на самом деле, является «семейством» хешей и имеет множество длин, наиболее популярной из которых является 256-бит. Разнообразие хешей SHA-2 может привести к путанице, поскольку сайты и авторы обозначают их по-разному. Если вы видите «SHA-2», «SHA-256» или «SHA-256 бит», эти имена относятся к одной и той же вещи. Если вы видите «SHA-224», «SHA-384» или «SHA-512», это относится к чередованию бит-длины SHA-2. Вы также можете увидеть, что некоторые сайты выписывают как алгоритм, так и длину бита, например «SHA-2 384.». Но это неприятно, как заставлять людей называть себя по имени и отчеству, когда вы просите их представиться.
SSL-индустрия выбрала SHA в качестве своего алгоритма хеширования для цифровых подписей
С 2011 по 2015 год SHA-1 был основным алгоритмом. Растущее число исследований, показывающих недостатки SHA-1, вызвало переоценку. Фактически, Google даже зашел так далеко, что создал конфликт SHA-1 (когда две части разрозненных данных создают одно и то же значение хеш-функции). Таким образом, с 2016 года SHA-2 является новым стандартом. Если вы получаете сегодня сертификат SSL/TLS, он должен использовать эту подпись. Иногда вам будут встречаться сертификаты, использующие SHA-2 384-бита. Реже будут встречаться 224-битные типы, поскольку они не одобрены для использования с публично доверенными сертификатами, или 512-битные типы, которые очень редко поддерживаются программным обеспечением. SHA-2, вероятно, останется актуальным еще не меньше, чем на 5 лет. Тем не менее, можно ожидать и некоторую атаку на алгоритм, которая вызвала бы более ранний переход. Вот хеш SHA-1 и SHA-2 сертификата SSL сайта выглядят так: Это то, о чем и шла речь. Возможно, это не так много, но цифровые подписи невероятно важны для обеспечения безопасности SSL\TLS.
Более высокий хеш может обеспечить большую безопасность, поскольку возможны более вероятные комбинации. Помните, что одна из важных функций алгоритма криптографического хеширования заключается в том, что он создает уникальные хеши. Опять же, если два разных значения или файла могут создать один и тот же хеш, то это то, что мы называем конфликтом. Безопасность цифровых подписей может быть гарантирована только при условии, что конфликтов не происходит. Конфликты опасны потому, что они позволяют двум файлам создавать одну и ту же подпись, поэтому, когда компьютер проверяет подпись, она может показаться действительной, даже если файл никогда не был подписан.
Сколько хешей?
Переход на SHA-2
В 2015 году индустрия SSL прошла «переход на SHA-2». Это включало повторную выдачу тысяч существующих сертификатов, чтобы новые файлы могли быть созданы и подписаны с SHA-2. Это также связано с крупными обновлениями программного обеспечения для выпуска, которым работают централизованные доверенные центры сертификации (их десятки). Как и ожидалось, были сбои. Крайний срок для выдачи новых SSL сертификатов с SHA-1 был назначен на 31 декабря 2015. По большей части, выдача была осуществлена к назначенному сроку. С тех пор было сделано несколько ошибок, и произошло несколько особых случаев. Но за последние три года сертификаты SHA-1 почти полностью исчезли. Сегодня, если вы столкнулись с сертификатом SHA-1, вы увидите предупреждение.
В Google Chrome все сертификаты SHA-1, срок действия которых истекал в 2016 году, не показывали зеленый замок в защищенных соединениях и вместо этого отображали тот же значок, что и незащищенное HTTP-соединение. Вы можете щелкнуть на значок, чтобы получить более конкретную информацию о том, почему он отображается, если есть другие причины, не связанные с подписью. Браузеры обрабатывали подписанные сертификаты SHA-1, срок действия которых истекал в 2017 году с более интенсивным предупреждением. Это связано с тем, что безопасность подписи напрямую связана с тем, как долго она действительна.
Сегодня, в 2018 году, Google просто суммарно удаляет незащищенные сайты, оставляя только напоминание о них в качестве предупреждения другим, кто может осмелиться совершить те же ошибки.
Обеспечение безопасности подписей
По прошествии времени атаки на криптографию станут лучше, а мощность компьютерной обработки станет дешевле. Это делает действительную подпись SHA-2 менее безопасной в 2020 году, чем в 2016 году. По этой причине выбирать придется еще более сильный алгоритм, чем это необходимо, чтобы краткосрочные улучшения не привели к компрометации безопасности в будущем. Для алгоритма хеширования нереально не оставаться в безопасности на протяжении десятилетия.
Отраслевые эксперты и исследователи безопасности во всем мире постоянно анализируют алгоритмы SHA-2 и другие криптографические алгоритмы хеширования, поэтому будьте уверены, что SSL-сертификаты будут иметь надежные и безопасные цифровые подписи на протяжении какого-то времени. Это не означает, что криптографы будут просто сидеть и ждать, пока не возникнет проблема. Преемник SHA-2, удобно названный SHA-3, уже создан. Когда придет время сделать другой коммутатор, индустрия SSL может использовать SHA-3 в качестве своего следующего выбора, или сможет воспользоваться совершенно другим алгоритмом.
Требуются годы, чтобы правильно исследовать и проверять новые криптографические стандарты, а затем разрабатывать программное обеспечение, которое их поддерживает. Надеюсь, это обнадеживает, потому что вы знаете, что индустрия всегда, по крайней мере, на один шаг впереди.
Алгоритм хеширования SHA-2 (SHA-256) — разбираем на примере

SHA-2 (Secure Hash Algorithm 2) — одно из самых популярных семейств алгоритмов хеширования. В статье «How SHA-2 Works Step-By-Step (SHA-256)» разобран каждый шаг алгоритма SHA-256, принадлежащего к SHA-2, и показано, как он работает на реальном примере. Перевод статьи опубликовал сайт tproger.ru.
Что такое хеш-функция?
Если вы хотите узнать больше о хеш-функциях, можете почитать Википедию. Но чтобы понять, о чём пойдёт речь, давайте вспомним три основные цели хеш-функции:
- обеспечить проверку целостности (неизменности) данных;
- принимать ввод любой длины и выводить результат фиксированной длины;
- необратимо изменить данные (ввод не может быть получен из вывода).
SHA-2 и SHA-256
SHA-2 — это семейство алгоритмов с общей идеей хеширования данных. SHA-256 устанавливает дополнительные константы, которые определяют поведение алгоритма SHA-2. Одной из таких констант является размер вывода. «256» и «512» относятся к соответствующим размерам выходных данных в битах.
Мы рассмотрим пример работы SHA-256.
SHA-256 «hello world». Шаг 1. Предварительная обработка
1. Преобразуем «hello world» в двоичный вид:
2. Добавим одну единицу:
3. Заполняем нулями до тех пор, пока данные не станут кратны 512 без последних 64 бит (в нашем случае 448 бит):
4. Добавим 64 бита в конец, где 64 бита — целое число с порядком байтов big-endian, обозначающее длину входных данных в двоичном виде. В нашем случае 88, в двоичном виде — «1011000».
Теперь у нас есть ввод, который всегда будет без остатка делиться на 512.
Шаг 2. Инициализация значений хеша (h)
Создадим 8 значений хеша. Это константы, представляющие первые 32 бита дробных частей квадратных корней первых 8 простых чисел: 2, 3, 5, 7, 11, 13, 17, 19.
Шаг 3. Инициализация округлённых констант (k)
Создадим ещё немного констант, на этот раз их 64. Каждое значение — это первые 32 бита дробных частей кубических корней первых 64 простых чисел (2–311).
Шаг 4. Основной цикл
Следующие шаги будут выполняться для каждого 512-битного «куска» входных данных. Наша тестовая фраза «hello world» довольно короткая, поэтому «кусок» всего один. На каждой итерации цикла мы будем изменять значения хеш-функций h0 – h7 , чтобы получить окончательный результат.
Шаг 5. Создаём очередь сообщений (w)
1. Копируем входные данные из шага 1 в новый массив, где каждая запись является 32-битным словом:
2. Добавляем ещё 48 слов, инициализированных нулями, чтобы получить массив w[0…63] :
3. Изменяем нулевые индексы в конце массива, используя следующий алгоритм:
Давайте посмотрим, как это работает для w[16] :
Это оставляет нам 64 слова в нашей очереди сообщений ( w ):
Шаг 6. Цикл сжатия
- Инициализируем переменные a, b, c, d, e, f, g, h и установим их равными текущим значениям хеша соответственно. h0, h1, h2, h3, h4, h5, h6, h7 .
- Запустим цикл сжатия, который будет изменять значения a…h . Цикл выглядит следующим образом:
Давайте пройдём первую итерацию. Сложение рассчитывается по модулю 2^32:
Все расчёты выполняются ещё 63 раза, изменяя переменные а … h . В итоге мы должны получить следующее:
Шаг 7. Изменяем окончательные значения
После цикла сжатия, но ещё внутри основного цикла, мы модифицируем значения хеша, добавляя к ним соответствующие переменные a … h . Как обычно, всё сложение происходит по модулю 2^32.
Шаг 8. Получаем финальный хеш
И последний важный шаг — собираем всё вместе.
Готово! Мы выполнили каждый шаг SHA-2 (SHA-256) (без некоторых итераций).
Алгоритм SHA-2 в виде псевдокода
Если вы хотите посмотреть на все шаги, которые мы только что сделали, в виде псевдокода, то вот пример: