Sha 256 что это такое
Пошагово объясняем, как работает алгоритм хеширования SHA-2 (SHA-256)
Авторизуйтесь
Пошагово объясняем, как работает алгоритм хеширования SHA-2 (SHA-256)
Автор Мария Багулина
SHA-2 (Secure Hash Algorithm 2) — одно из самых популярных семейств алгоритмов хеширования. В этой статье мы разберём каждый шаг алгоритма SHA-256, принадлежащего к SHA-2, и покажем, как он работает на реальном примере.
Что такое хеш-функция?
Если вы хотите узнать больше о хеш-функциях, можете почитать Википедию. Но чтобы понять, о чём пойдёт речь, давайте вспомним три основные цели хеш-функции:
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. Основной цикл
Шаг 5. Создаём очередь сообщений (w)
1. Копируем входные данные из шага 1 в новый массив, где каждая запись является 32-битным словом:
2. Добавляем ещё 48 слов, инициализированных нулями, чтобы получить массив w[0…63] :
3. Изменяем нулевые индексы в конце массива, используя следующий алгоритм:
Давайте посмотрим, как это работает для w[16] :
Это оставляет нам 64 слова в нашей очереди сообщений ( w ):
Шаг 6. Цикл сжатия
Давайте пройдём первую итерацию. Сложение рассчитывается по модулю 2^32:
Шаг 7. Изменяем окончательные значения
Шаг 8. Получаем финальный хеш
И последний важный шаг — собираем всё вместе.
Готово! Мы выполнили каждый шаг SHA-2 (SHA-256) (без некоторых итераций).
Алгоритм SHA-2 в виде псевдокода
Если вы хотите посмотреть на все шаги, которые мы только что сделали, в виде псевдокода, то вот пример:
SHA-256
SHA-2 (англ. Secure Hash Algorithm Version 2 — безопасный алгоритм хеширования, версия 2) — собирательное название однонаправленных хеш-функций SHA-224, SHA-256, SHA-384 и SHA-512. Хеш-функции предназначены для создания «отпечатков» или «дайджестов» сообщений произвольной битовой длины. Применяются в различных приложениях или компонентах, связанных с защитой информации.
Содержание
История
В июле 2006 года появился стандарт RFC 4634 «Безопасные хеш-алгоритмы США (SHA и HMAC-SHA)», описывающий SHA-1 и семейство SHA-2.
Агентство национальной безопасности от лица государства выпустило патент на SHA-2 [4] под лицензией Royalty Free. [5]
Алгоритм
Общее описание
Хеш-функции семейства SHA-2 построены на основе структуры Меркла — Дамгарда (англ.).
В следующей таблице показаны некоторые технические характеристики различных вариантов SHA-2. «Внутреннее состояние» обозначает промежуточную хеш-сумму после обработки очередного блока данных:
Хеш-функция | Длина дайджеста сообщения (бит) | Длина внутреннего состояния (бит) | Длина блока (бит) | Максимальная длина сообщения (бит) | Длина слова (бит) | Количество итераций в цикле |
---|---|---|---|---|---|---|
SHA-256/224 | 256/224 | 256 | 512 | 2 64 − 1 | 32 | 64 |
SHA-512/384 | 512/384 | 512 | 1024 | 2 128 − 1 | 64 | 80 |
Псевдокод SHA-256
SHA-224 идентичен SHA-256, за исключением:
SHA-512 имеет идентичную структуру, но:
SHA-384 идентичен SHA-512, за исключением:
Примеры
Ниже приведены примеры хешей SHA-2. Для всех сообщений подразумевается использование кодировки
Малейшее изменение сообщения в подавляющем большинстве случаев приводит к совершенно другому хешу вследствие лавинного эффекта. К примеру, при изменении dog на cog получится:
Криптоанализ
На 2008 год хеш-функции SHA-2, в отличие от SHA-1, недостаточно изучены. В 2003 году Гилберт и Хандшух провели исследование SHA-2, но не нашли каких-либо уязвимостей. [6]
Криптоанализ хеш-функции подразумевает исследование устойчивости алгоритма по отношению, по меньшей мере, к следующим видам атак:
От устойчивости хеш-функции к нахождению коллизий зависит безопасность электронной цифровой подписи с использованием данного хеш-алгоритма. От устойчивости к нахождению прообраза зависит безопасность хранения хешей паролей для целей аутентификации.
В марте 2008 года индийские исследователи Сомитра Кумар Санадия и Палаш Саркар опубликовали найденные ими коллизии для 22 итераций SHA-256 и SHA-512. [7] В сентябре того же года они представили метод конструирования коллизий для усечённых вариантов SHA-2 (21 итерация). [8] [9]
Ввиду алгоритмической схожести SHA-2 с SHA-1 и наличия у последней потенциальных уязвимостей ведутся поиски улучшенных альтернатив. [10] [11] Новый стандарт будет назван SHA-3, он будет определен конкурсом, проводимым Национальным институтом стандартов и технологий в 2008—2012 гг. [12]
Применение и сертификация
SHA-224, SHA-256, SHA-384 и SHA-512 законом США допускаются к использованию в некоторых правительственных приложениях, включая использование в рамках других криптографических алгоритмов и протоколов, для защиты информации, не имеющей грифа секретности. Стандарт также допускает использование SHA-2 частными и коммерческими организациями. [13]
Некоторые примеры применения SHA-2 указаны в таблице:
Область применения | Детали |
---|---|
S/MIME | SHA-224, SHA-256, SHA-384 или SHA-512 дайджесты сообщений [15] |
SHA-384 или SHA-512 хеши паролей [16] | |
DNSSEC (англ.) | SHA-256 дайджесты DNSKEY в протоколе DNSSEC [17] |
X.509 | SHA-224, SHA-256, SHA-384 и SHA-512 используются для создания электронной цифровой подписи сертификата [18] |
SHA-384, SHA-512 используются для создания электронной цифровой подписи [19] | |
IPSec | Некоторые реализации поддерживают SHA-256 в протоколах IKE [20] |
SHA-2 используется для создания электронной цифровой подписи [21] | |
SHACAL-2 | Блочный алгоритм шифрования SHACAL-2 построен на основе хеш-функции SHA-256 |
Передача файлов | Для надёжности передачи файлов по сети иногда указываются их SHA-2 дайджесты [22] |
Сертификация
На 5 ноября 2008 года было сертифицировано более 250-ти реализаций SHA-2, четыре из которых могли оперировать сообщениями с длиной в битах некратной восьми. [24]
Примечания
Литература
См. также
Внешние ссылки
Стандарты
Реализации
Криптоанализ
CRC | HAVAL | LM-хеш | MD4 | MD6 | PJW-32 | RIPEMD-256 | SHA-1 | SHA-2 | Snefru | Whirlpool | ГОСТ Р 34.11-94
Полезное
Смотреть что такое «SHA-256» в других словарях:
Sha-256 — (Secure Hash Algorithm) est une fonction de hachage cryptographique conçue par la National Security Agency des États Unis (NSA), et publiée en 2000. Elle produit un résultat (appelé « hash » ou condensat) de 256 bits et dérive du SHA 1 … Wikipédia en Français
SHA-256 — (Secure Hash Algorithm) est une fonction de hachage cryptographique conçue par la National Security Agency des États Unis (NSA), et publiée en 2000. Elle produit un résultat (appelé « hash » ou condensat) de 256 bits et dérive du… … Wikipédia en Français
SHA-256 — Der Begriff secure hash algorithm (engl. für sicherer Hash Algorithmus), kurz SHA, bezeichnet eine Gruppe standardisierter kryptologischer Hash Funktionen. Diese dienen zur Berechnung eines eindeutigen Prüfwerts für beliebige elektronische Daten … Deutsch Wikipedia
Spécifications SHA-256 — SHA 256 est une fonction de hachage cryptographique dérivée de SHA 1 qui fournit une empreinte de 256 bits. Pour l histoire, la cryptanalyse et d autres aspects liés à cette fonction, voir l article SHA 256. Sommaire 1 Introduction 2 Symboles et… … Wikipédia en Français
Specifications SHA-256 — Spécifications SHA 256 SHA 256 est une fonction de hachage cryptographique dérivée de SHA 1 qui fournit une empreinte de 256 bits. Pour l histoire, la cryptanalyse et d autres aspects liés à cette fonction, voir l article SHA 256. Sommaire 1… … Wikipédia en Français
Spécifications sha-256 — SHA 256 est une fonction de hachage cryptographique dérivée de SHA 1 qui fournit une empreinte de 256 bits. Pour l histoire, la cryptanalyse et d autres aspects liés à cette fonction, voir l article SHA 256. Sommaire 1 Introduction 2 Symboles et… … Wikipédia en Français
SHA-224 — SHA 2 (англ. Secure Hash Algorithm Version 2 безопасный алгоритм хеширования, версия 2) собирательное название однонаправленных хеш функций SHA 224, SHA 256, SHA 384 и SHA 512. Хеш функции предназначены для создания «отпечатков» или… … Википедия
SHA-512 — SHA 2 (англ. Secure Hash Algorithm Version 2 безопасный алгоритм хеширования, версия 2) собирательное название однонаправленных хеш функций SHA 224, SHA 256, SHA 384 и SHA 512. Хеш функции предназначены для создания «отпечатков» или… … Википедия
SHA-384 — SHA 2 (англ. Secure Hash Algorithm Version 2 безопасный алгоритм хеширования, версия 2) собирательное название однонаправленных хеш функций SHA 224, SHA 256, SHA 384 и SHA 512. Хеш функции предназначены для создания «отпечатков» или… … Википедия
Sha-1 — Une itération de SHA 1 avec deux rotations vers la gauche et une fonction non linéaire qui dépend du numéro d itération, deux autres variables interviennent à chaque tour SHA 1 (Secure Hash Algorithm) est une fonction de hachage cryptographique… … Wikipédia en Français
«Привет, мир»: разбираем каждый шаг хэш-алгоритма SHA-256
Что такое хэш-функция?
Три основных цели хэш-функций:
SHA-256 «Привет, мир»
Шаг 1 — Предварительная работа
Преобразуем «Привет, мир» в двоичный код:
Дополните код нулями, пока данные не станут равны 512 бит, минус 64 бита (в результате 448 бит):
Добавьте 64 бита в конец в виде целого числа с порядком байтов от старшего к младшему (big-endian), представляющего длину входного сообщения в двоичном формате. В нашем случае это 88, или «1011000».
Теперь у нас есть ввод, который будет делиться на 512 без остатка.
Шаг 2 — Инициализируйте значения хэша (h)
Теперь мы создаем 8 хэш-значений. Это жестко запрограммированные константы, которые представляют собой первые 32 бита дробных частей квадратных корней из первых восьми простых чисел: 2, 3, 5, 7, 11, 13, 17, 19.
Шаг 3 — Инициализация округленных констант (k)
Как и в предыдущем шаге, мы создадим еще несколько констант. На этот раз их будет 64. Каждое значение (0—63) представляет собой первые 32 бита дробных частей кубических корней первых 64 простых чисел (2—311).
Шаг 4 — Цикл фрагментов
Следующие шаги будут выполняться для каждого 512-битного «фрагмента» из наших входных данных. Поскольку фаза «Привет, мир» короткая, у нас есть только один фрагмент. В каждой итерации цикла мы будем изменять хэш-значения h0-h7, что приведет нас к конечному результату.
Шаг 5 — Созданием расписание сообщений (w)
Скопируйте входные данные из шага 1 в новый массив, где каждая запись представляет собой 32-битное слово:
Добавьте еще 48 слов, инициализированных нулем, чтобы у нас получился массив w [0… 63]
Измените обнуленные индексы в конце массива, используя следующий алгоритм:
Для i из w[16…63]:
В расписании сообщений осталось 64 слова (w):
Шаг 6 — Сжатие
Инициализируйте переменные a, b, c, d, e, f, g, h и установите их равными текущим значениям хэш-функции соответственно h0, h1, h2, h3, h4, h5, h6, h7.
Запустите цикл сжатия, который изменит значения a… h. Выглядит он следующим образом:
Все вычисления выполняются еще 63 раза, меняя переменные a-h. К счастью, мы не делаем это вручную. В итоге мы получили:
Шаг 7 — Измените окончательные значения
После цикла сжатия, во время цикла фрагментов, мы изменяем хеш-значения, добавляя к ним соответствующие переменные a-h. Как и ранее, все сложение производится по модулю 2 ^ 32:
Шаг 8 — Финальный хэш
Наконец, соединяем все вместе.
Мы прошли каждый шаг (за исключением нескольких итераций) SHA-256 в подробностях. Если хотите увидеть весь путь, что мы совершили, в форме псевдокода, заходите на WikiPedia.
Работа с SHA-256
В этой статье мы поговорим об алгоритме хеширования SHA-256, подробно разберём что это такое, для чего нужно и как это работает. Повествование будет вестись в стиле «SHA-256 — это не просто, а очень просто» и рассчитано на неподготовленных пользователей и любителей электроники и программирования. В завершающей части статьи будут даны практические примеры работы с алгоритмом хеширования SHA-256 на микроконтроллерах в среде разработки Arduino IDE.
Криптография и DIY
Вообще, работа с криптографическими функциями предполагает некоторой базовый уровень знаний в математике и программировании, что отпугивает многих любителей микроконтроллеров. Но криптография и, в частности, хеширование по алгоритму SHA-256 очень широко применяются в современных коммуникациях (например для шифрования беспроводных сообщений) и игнорировать эту тему становится практически невозможно.
Поэтому в этой статье мы максимально просто и доходчиво объясним что такое SHA-256 и как работать на практике с этим алгоритмом хеширования, так, чтобы стало понятно даже самому неподготовленному читателю.
Ради простоты изложения будут опущены многие «заумные» подробности и всё будет изложено максимально простым языком. Те, кому нужны подробности, могут более детально ознакомиться с этой темой на множестве ресурсов в интернете.
Что такое хеширование
Хеширование — это алгоритм, который преобразует исходные данные (любого объёма) в небольшой набор выходных данных фиксированной длины. Входными данными может быть одно слово или целый роман, а выходными будет набор из нескольких байт. Важным для нас в этом преобразовании являются:
Исходя из этих свойств хеширования, становятся понятными области его применения — это контроль за целостностью различных сообщений, хранение «отпечатков» паролей и т. д. и т. п. Например, вы посчитали хеш какого-то документа — изменение хотя бы одного байта в нём приведёт к генерации другого хеша и вам (получателю) станет понятно, что документ кто-то изменил.
Что важно понимать: SHA-256 хотя и криптографический алгоритм, но он не предназначен для шифрования сообщений, для этого есть другие алгоритмы, например AES-128. SHA-256 предназначен исключительно для создания хешей и контроля целостности информации. А связка шифрующих алгоритмов с SHA-256 в практических приложениях позволяет создавать надёжно защищённые коммуникации.
На практике существуют проблемы с обеспечением уникальности хешей и некоторые другие проблемы чисто математического характера, но для простоты изложения мы их тут рассматривать не будем, а оставим профессиональным математикам.
SHA-256
SHA-256 — это реализация одного из множества возможных алгоритмов хеширования. Благодаря своей (относительной) простоте, достаточной надёжности и криптостойкости, а также приемлемой скорости работы, SHA-256 получил широкое распространение в современном мире. Он используется в телекоммуникациях, интернете, для шифрования беспроводных пакетов в IoT и т. д. и т. п. В общем, это один из наиболее широко используемых алгоритмов хеширования.
Для простоты изложения и восприятия материала мы здесь опустим всё математическое обоснование работы этого алгоритма, а сосредоточимся на практической части работы с ним на микроконтроллерах.
В практическом плане для нас важно знать, что выходное сообщение (хеш) алгоритма SHA-256 составляет 32 байта или 256 бит, собственно отсюда и цифра «256» в его названии.
Для чего нам может понадобится SHA-256 (в связке с другими алгоритмами, шифрованием и т. д.):
* Пояснение: алгоритм SHA-256 обладает одним (из многих) полезным свойством — он позволяет генерировать данные (хеши) с хорошей энтропией («мерой хаоса») на основе «бедных» входных данных. Это может пригодиться для генерации уникальных паролей, создания «магических» чисел для генераторов псевдо-случайных последовательностей и т. п. применений.
На этом теоретическую подготовку можно считать законченной и далее мы перейдём к рассмотрению практических примеров работы с алгоритмом SHA-256 на микроконтроллерах.
Библиотека SHA-256
В своих экспериментах мы будем использовать библиотеку, реализующую алгоритм SHA-256 на Arduino. Эта библиотека содержит несколько примеров, которые мы подробно разберём далее.
Перед использованием функций SHA-256, библиотеку нужно установить стандартным для Arduino способом. Здесь предполагается, что вы достаточно опытный пользователь и умеете работать с Arduino IDE, создавать и загружать скетчи в микроконтроллер.
Версия Arduino IDE может быть любая, начиная с 1.6.5, микроконтроллер подойдёт тоже почти любой из линейки Arduino, например Uno, Nano, Mega и т. д.
Пример 1: получаем хеш SHA-256
Цель этой статьи — объяснить простыми словами что такое SHA-256 и дать практические навыки работы с хешированием для использования его в ваших проектах. Поэтому далее мы подробно разберём работу функций библиотеки SHA-256.
В первом примере мы просто получим хеш SHA-256 строки «abc». Вместо этой строки могла бы быть любая другая. Обратите внимание, что длина исходной строки меньше длины генерируемого хеша.
Теперь полный код первого примера:
И далее подробно разберём его работу. Вначале скетча мы подключаем библиотеку SHA-256
Далее идёт функция setup(), в которой и происходят все основные действия. Вначале мы инициализируем работу последовательного порта и выводим сообщение о старте скетча в Serial:
Затем выводим вспомогательное сообщение об ожидаемом результате работы нашей функции вычисления хеша SHA-256.
И затем начинаем работу собственно по вычислению хеша SHA-256, а именно, инициализируем объект Sha256.
в которой мы направляем исходное сообщение «abc» на вход библиотечной функции вычисления хеша SHA-256. Несмотря на присутствие слова «print» в названии этой функции, она ничего не выводит на печать, а просто получает входные данные.
И наконец, функция Sha256.result() возвращает нам массив из 32-х байт, который и является хешем SHA-256 для входящей строки, в данном случае, «abc».
Поскольку хеш (набор байтов) нужно представить в удобном для восприятия виде, то результат работы функции Sha256.result() направляется на вход функции печати хеша в Serial.
Сама по себе работа этой функции довольно интересна, но, поскольку это выходит за рамки текущей статьи, то мы оставляем анализ и разбор её работы заинтересованному читателю в качестве «домашнего задания».
Нам же здесь нужно знать только то, что эта функция выводит хеш в стандартном и читаемом виде.
Как вы видите, результат работы нашего скетча по вычислению хеша SHA-256 строки «abc» полностью совпал с ожидаемым. Этот простой пример показывает как вы можете вычислять хеш SHA-256 в своих реальных проектах.
Пример 2: работаем с HMAC
В первом примере мы разобрали самый простой случай, когда мы просто получали SHA-256 хеш исходных данных. Во втором примере мы рассмотрим несколько более сложный вариант, когда в получении хеша участвует некий секретный ключ (секретная последовательность байт).
Этот вариант называется использованием HMAC (Hash-based Message Authentication Code или «основанный на хеше код проверки подлинности сообщения»). Звучит пугающе, но на самом деле всё очень просто — в процесс получения хеша добавляется секретный ключ (который знаете вы и получатель вашего сообщения) и на принимающей стороне могут удостовериться, что ваше сообщение не было изменено.
Полный код второго примера:
Теперь разберём подробно работу второго примера. В начале мы объявляем секретный HMAC ключ
который будет участвовать в получении SHA-256 хеша и который должен иметь получатель вашего сообщения. В данном случае это последовательность из 20-и байт 0x0b. Этот набор байт может быть любым, например, значения могут быть разными или длина ключа может быть меньше или больше 20-и байт. Здесь важно только то, что и вы и получатель вашего сообщения должны иметь одинаковый секретный ключ.
Далее идут стандартные действия по инициализации Serial порта и вывод сообщения о старте нашего скетча, а также вывод ожидаемого значения HMAC хеша.
Затем начинается непосредственно работа по генерации хеша. Мы инициализируем объект Sha256 нашим ключом и указываем его длину 20 байт.
Далее подаём на вход строку «Hi There», хеш которой нам нужно получить
Получаем результат при помощи функции
и выводим результат на печать.
Вот результат работы нашего скетча.
Как видите, работа с использованием секретного HMAC ключа не намного сложнее простого вычисления SHA-256 хеша. Фактически, библиотека SHA-256 берёт на себя все трудности по вычислению хешей и нам остаётся только воспользоваться её функциями.
Заключение
Библиотека SHA-256 содержит ещё множество примеров использования функций получения SHA-256 хешей, но все они являются вариациями вышеприведённых примеров и, если вы поняли общие принципы работы с хешированием SHA-256, то для вас не составит труда использовать эту современную и актуальную технологию в своих проектах.
Алгоритм хеширования SHA-256 — что это такое простыми словами и как работает, функции и примеры?
SHA-256 – алгоритм шифрования хэш-функции из семейства SHA-2 (Secure Hash Algorithm, с англ. – Алгоритм безопасного хэширования). Приставка 256 обозначает размер вывода – 256 бит. Существуют и другие форматы: 224, 384, 512.
Разработана для Агентства Национальной Безопасности США (АНБ) в 2001 году. Запатентована под номером 6829355 в США и распространяется свободно по бесплатной лицензии (RF).
Метод хэширования SHA-256 используется правительством и гражданскими учреждениями США согласно Федеральным стандартам обработки информации, для обеспечения защиты данных. А ещё с его помощью генерируются хеши в сети Биткоин.
Предшественник (SHA-1) был успешно атакован. В 2011 году Марк Стивенс доказал возможность коллизионной атаки, а в 2017 Google опубликовал отчёт об успешном её проведении. С тех пор браузеры отказались от SSL-сертификатов на SHA-1, и Windows прекратил поддержку закодированных алгоритмом подписей в 2020 году.
В SHA-256 атаки с нахождением прообраза могут вычислить 52, а при коллизионной атаке пока что удаётся раскрыть 46 раундов из 64.
Что такое алгоритм хэширования и шифрования sha256 (sha 256 algorithm)?
Задача хэширования – превратить информацию в строку. Функция может принять данные неограниченного размера, даже 10 мегабайт текста из 1000 книг. Процесс хеширования происходит раундами (кругами) – так можно уместить в строку любой объем. Но расшифровать обратно уже не получится. Если кому-то удастся это сделать, то алгоритм автоматически потеряет смысл.
Задача шифрования – превратить информацию в условно хаотичный набор символов, расшифровать которые можно только с помощью ключа. Зашифрованный файл размером в 10 мегабайт будет занимать как минимум столько же места, что и является главным отличием его от хэширования: оно превращает любой объем данных в строку одинаковой длины.
Биткоин не использует шифрование. Приставка «крипто» (crypto – encrypt – шифровать) в его обозначении «криптовалюта», была присвоена ему только потому, что его алгоритм цифровой подписи использует методы, основанные на эллиптических кривых, что применяются в шифровании.
Вместо этого пользователь генерирует пару – открытый и закрытый ключ. Они связаны математически, и мы можем утверждать, что получить закрытый ключ из открытого – невозможно, что и подтверждает право владения BTC.
В блокчейне у всех транзакций есть неизрасходованные выходы (UTXO), а проще говоря – балансы. Они связаны с биткоин-адресами и мы можем просматривать их в сети публично. Имея на балансе 1 BTC, у вас есть закрытый ключ от открытого ключа с этим UTXO, а значит вы сможете подписать транзакцию и будет создан новый UTXO с передачей права на открытый ключ получателя.
SHA-256 генерирует строки максимально надёжно на сегодняшний день. Достаточно, чтобы их нельзя было расшифровать, получив закрытые данные из открытого ключа.
Алгоритм удовлетворяет 4 ключевым требованиям:
Как работает майнинг на кодировке SHA-256?
В интернете есть сайты с конвертацией любого текста с помощью функции SHA-256. Можно попробовать сделать это самому.
Например, слово «Hello»: 185f8db32271fe25f561a. a518007d1764826381969.
Выходная строка неизменна, это отличает хэширование от шифрования. Если другой человек с другого устройства введёт «Hello», он получит ту же строку.
Bitcoin использует двойное хеширование. Полученный хэш, он пропускает повторно через SHA-256. Это нужно во избежание атаки «дней рождения», хотя вероятность её невелика.
Например, вводим полученный хэш от «Hello»: 185f8db32271fe25f561a. da518007d1764826381969 = 52c87cd40ccfbd78. d4c3684ed60f6513e8d16077e5b8e.
По такому принципу собирается и обрабатывается целый ряд данных. Результат – блокчейн. Цепочка блоков, образно растущая вверх. Нижние блоки невозможно достать и подменить, не разрушив при этом всё строение сети.
Древо Меркла
У каждой транзакции есть хэш. Он представляет такую же строку, выводимую с помощью функции SHA-256. Иерархическая принадлежность транзакций образовывает древо вида родитель-ребёнок. Подобно семейному древу, древо Меркла хранит данные обо всех предыдущих транзакциях. Эти данные хранятся у тысяч узлов (нод), и если кто-то попытается подсунуть в сеть ложный баланс или перевод, несоответствие историческому наследию будет обнаружено и отвергнуто сетью.
Корень Меркла добавляется в функцию наоборот. Например: b7a0c5014ae6ecb. 707a42516e94899073 вместо 37099849e61524. 019efbce6ea4105c0a7b.
Версия клиента
Актуальная версия, одобренная сетью. Например: 02000000.
Часть строк принимается в формате 4-byte «little-endian», и это одна из них.
Хэш предыдущего блока
Скрепляет блокчейн, гарантируя, что следующий блок будет ссылаться на прежде подтверждённый.
Вводится наоборот. Например: 05c2ddc616d1b90. 0000000000000000 вместо оригинального 000000000000000. 346f13a009b1d616cdd2c50.
Зеркальное отражение строки избавляет алгоритм от потери детализации. Чем больше значений, тем меньше вероятность того, что сложность окажется слишком трудной или слишком лёгкой.
Метка времени (Timestamp)
В формате системы Unix, количество секунд от начала эпохи (1 января 1970, 00:00).
Принимается сетью, только если число больше медианы временных штампов последних 11 блоков, и меньше медианы штампов, что возвращают подключённые ноды (скорректированное сетью время) + 2 часа.
Биткоин использует беззнаковое целое число для метки времени, поэтому «проблема 2038 года» откладывается еще на 68 лет.
Таргет (Target)
Сложность следующей цели. Пересчитывается каждые 2016 блоков (примерно 2 недели). Если хэшрейт в сети будет расти, увеличится и количество нулей в таргете искомого хеша, что потребует перебора большего количества хэшей при майнинге криптовалюты. И наоборот, уменьшение желающих участвовать в добыче BTC и валидации блоков, уменьшает сложность и «снижает» таргет. За 1 цикл не может быть изменён более чем в х4 раза.
Например таргет генезис блока был 00000000ffff00000000000000. 00000, в 2013 уже 0000000000000529b10000000. 00000, в 2018 – 00000000000000000049500d0. 00000, а в 2021 – 0000000000000000000cdf6f00. 00000. Судя по количеству нулей, можно легко наблюдать рост сложности.
Помещается в функцию тоже в компактном 4-байтном формате вида: f2c9749a.
Нонс (Nonce)
Аббревиатура от числа, используемого единожды, при переборе хэшей.
Мы взяли 5 известных значений, описанных выше и теперь можем начать подставлять nonce в функцию, покуда не будет найден хэш, меньше таргета.
1, 2, 3… 40348, 40349… 168437213, 168437214, 168437215…
Когда нонс подойдёт, и мы получим хэш-значение меньше таргета, установленного сетью, новый блок будет найден. Майнер может добавить в него избранные транзакции (не превышая допустимый размер блока: 1,5 МБ) забетонировать их в нём и получить за это комиссию.
Поиск следующего блока в сети произойдёт с участием этого же набора данных, что теперь изменились в связи с новыми транзакциями в древе Меркла, временем на планете, и т.д.
Особенности SHA-256
SHA-2 – это криптографическая хеш-функция и обычно является строительным блоком для других криптографических конструкций. Удовлетворяя требованиям криптографического хэширования, это односторонняя функция, которая детерминирована, быстро вычисляется, устойчива к атакам с предварительным и вторым прообразом, а также устойчива к коллизиям.
Далее её можно использовать в своих целях, наделяя особенностями. Например Bitcoin сделал двойное SHA-256.
Оборудование для майнинга
В сравнении с алгоритмом RandomX Monero (только CPU), SHA-256 майнинг не может быть устойчив к ASIC или GPU.
Для добычи BTC может использоваться любой процессор. В гонке за скоростью перебора хэшей выигрывают ASIC майнеры (интегральные схемы особого назначения), спроектированные специально под задачу добычи Bitcoin. Самые популярные производители: Bitmain, MicroBT.
SHA-256 – что можно майнить
Все форки Bitcoin пошли по простому пути и используют тот же алгоритм хэширования. Сюда входят известные «альткоины»: Bitcoin Cash, Namecoin, Peercoin, Emercoin и сотни других, менее популярных.
Ethereum разработал собственную функцию Ethash, чтобы допустить к добыче только видеокарты (до момента полного переключения на Ethereum 2.0). Litecoin – Scrypt (в попытках быть резистентным к асикам). Современные криптовалюты предпочитают алгоритм Proof-of-Stake, в которых добыча криптовалют называется стейкингом. Традиционные Proof-of-Work вычисления становятся инвесторам всё менее интересными.
Список криптовалют на SHA-256
Отсортированы по размеру капитализации.