Блокчейн/Уровень II · Механика/2.1 Криптография/Урок 2
HASH160: SHA-256, затем RIPEMD-160
Двойной хеш, сокращающий ключи, и слабость, которую он скрывает
МатериалыОбозреватель блоков, например blockstream.info или blockchain.comНабор адресов Bitcoin для примераТекстовый редактор или электронная таблица
Любопытство
- Зачем Bitcoin использует две разные хеш-функции последовательно?
- Что даёт 160-битный хеш такого, чего не даёт 256-битный?
- Как хеш длиной 20 байт может быть одновременно безопасным и уязвимым?
Исследование
- Необработанный публичный ключ в Bitcoin в сжатом виде занимает 33 байта. Это слишком много для эффективного использования в транзакциях. Чтобы сократить его без ущерба для криптографической надёжности, Bitcoin применяет двухэтапный процесс: SHA-256, а затем RIPEMD-160. Эта комбинация называется HASH160 и даёт результат длиной 160 бит (20 байт) — достаточно компактный для кодирования в адрес.
- Хеш-функция RIPEMD-160, разработанная в 1996 году Хансом Доббертином, Антооном Босселарсом и Бартом Пренелем, даёт более короткий результат, чем SHA-256, и создана в рамках открытого академического процесса. Сначала к публичному ключу (или, в случае P2SH, к скрипту) применяется SHA-256, затем к результату SHA-256 применяется RIPEMD-160. Такая последовательность обеспечивает баланс безопасности и эффективности; она используется в выходах Pay-to-PubKey-Hash (P2PKH), Pay-to-Script-Hash (P2SH) и Pay-to-Witness-PubKey-Hash (P2WPKH).
- Использование двух разных хеш-функций добавляет ещё один эшелон защиты. Вложенность помогает главным образом против атак на нахождение прообраза, поскольку подбор ключа под заданный хеш потребовал бы взлома обеих функций; против коллизий она не помогает, так как любая коллизия SHA-256 одновременно является коллизией HASH160. При этом 160 бит выходного значения означают стойкость к коллизиям около 80 бит, что приемлемо для выходов адресов с одним ключом. Проблемы возникают в совместных скриптах, в формировании которых участвуют несколько сторон, — поэтому SegWit и Taproot используют для нативных скриптов 32-байтные значения.
- Распространено утверждение, что хеширование ключа защищает монеты от будущих квантовых компьютеров. Эта защита частичная. При трате публичный ключ раскрывается, поэтому защищены только выходы, ключи которых ещё ни разу не были показаны; повторное использование адресов сводит защиту на нет; а выходы Taproot размещают публичный ключ непосредственно в блокчейне. Достаточно мощный квантовый компьютер поставил бы под угрозу любой раскрытый ключ.
- Чтобы построить адрес Bitcoin из публичного ключа, к нему применяется HASH160, затем перед результатом ставится идентификатор сети (0x00 для P2PKH в основной сети), а после — 4-байтная контрольная сумма, полученная двойным SHA-256. Эта 25-байтная последовательность затем кодируется в Base58, что даёт удобочитаемый адрес. Такая кодировка исключает неоднозначные символы и включает контрольную сумму для обнаружения ошибок при переписывании.
- Чтобы увидеть это на практике, откройте обозреватель блоков и найдите транзакцию P2PKH. Найдите поле scriptPubKey — в нём должен быть 20-байтный хеш. Сравните его с публичным ключом, раскрытым при трате этого выхода. Вы увидите, что публичный ключ длиннее, а хеш — это укороченная закодированная версия, используемая в адресе.
Ключевые факты
- HASH160 — это комбинация SHA-256, за которой следует RIPEMD-160.
- Длина результата HASH160 — 160 бит (20 байт).
- RIPEMD-160 была разработана в 1996 году Хансом Доббертином, Антооном Босселарсом и Бартом Пренелем.
- HASH160 используется в выходных скриптах P2PKH, P2SH и P2WPKH.
- 160-битные хеши обеспечивают стойкость к коллизиям около 80 бит.
- Хеширование скрывает публичный ключ только до момента траты; выходы Taproot показывают ключ напрямую.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 адресов Bitcoin. Укажите их формат (начинается с 1, 3, bc1q, bc1p и т. д.) и длину в символах.
6СгруппироватьРаспределите 9 адресов по 6 группам в зависимости от типа кодировки и типа скрипта (например, Base58, Bech32, SegWit и т. д.).
3Выделить главноеСведите 6 групп к 3 принципам, объясняющим, почему Bitcoin использует разные форматы адресов.
1КристаллизоватьНапишите одно предложение о том, почему Bitcoin использует две хеш-функции для создания адреса.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.