Для вычисления транзакционных хешей, блок хешей и Merkle деревьев Биткойн использует SHA256d
Код:
SHA256d (х) = SHA256 (SHA256 (х))
Эффективно все хэширования операции принимают в два раза дольше. Это не так плохо, как это звучит, потому что проверка ECDSA занимает большинство циклов процессора при проверке блока, но есть какие-либо выгоды для работы, проделанной в двойной штриховкой? Или мы должны просто признать, что это было плохое решение реализации Сатоши? Простой, если всегда лучше в криптографии так Satoshi должен был причины, чтобы пойти с двойным хэшем, но мне интересно, если эта причина была основана на порочном понимании ограниченных преимуществ двойного хэширования.
На протяжении многих лет я слышал пару теорий, но я не думаю, что они держат никакой критики.
1) Двойной хэширования предотвращает расширение длины атаки
Это правда, но расширение длины атака не является полезной против Bitcoin. Длина удлинитель атака включает подпись подмены аутентификации, когда посыл и приемник используют общий секрет. Там нет Доли секретных сообщений в протоколе Bitcoin и, таким образом, нет никаких возможных атак расширения длины.
2) Двойная хеширование обеспечивает запасной вариант, если сопротивление прообраза ослаблено
Это также верно, но только для первого сопротивления прообраза, который включает в себя вход неизвестности. Как таковой есть некоторая заслуга это логическое обоснование в использовании HASH160 (или любой двойной хэша) для получения PubKeyHash (или ScriptHash) из Публичных (или сценария). Любая выгода для двойного хеширования теряется, если адрес повторно используют в качестве входного становится известным. Он также будет применяться только тогда, когда из-за криптоанализ сопротивления второго прообраза деградировал, но сопротивление первого прообраза не было.
Это не относится к любому использованию SHA256d, поскольку они используются в тех случаях, когда, как известно, вход. Для тех, кто не ясно на первом и втором сопротивление прообраза:
котировка
Первое прообразом сопротивления: это вычислительно невозможно найти какой-либо вход, который хэширует на заранее определенный выходной
Учитывая "Y" таким образом, что (х) = у, трудно найти любой прообраз х.
Во-второе-прообраз сопротивление: это вычислительно невозможно найти второй вход, который имеет один и тот же вывод, как и указанный вход.
Учитывая х, трудно найти второй прообраз х»≠ х, что Н (х) = Н (х ')
Учитывая "Y" таким образом, что (х) = у, трудно найти любой прообраз х.
Во-второе-прообраз сопротивление: это вычислительно невозможно найти второй вход, который имеет один и тот же вывод, как и указанный вход.
Учитывая х, трудно найти второй прообраз х»≠ х, что Н (х) = Н (х ')
Основное различие в двух сценариях, что известно злоумышленнику. В первый злоумышленник имеет только хэш. Хороший пример может быть взломав пароль. Во второй злоумышленник имеет оригинальный вход. Хорошим примером может служить производя "подделка" TXN / блок / merkletree / Публичные, что приводит к тому же хэшу, как существующему подделать сеть и украсть средства.
В Bitcoin каждое использование SHA256 опирается на второе сопротивление не первая прообраза для обеспечения безопасности. Вход уже известен, так что промежуточный хеш может быть вычислен. Второй шаг хэширования не обеспечивает безопасности, поскольку если атакующие находит второй вход, который производит тот же самый промежуточный хеш в качестве цели, то они оба будут, очевидно, производят тот же конечный хэш. Вполне возможно, что двойное хеширование может затвердеть хэш от первого прообраза атаки, но это не повышает безопасность Bitcoin.
3) Двойной хэширования может сломаться лазейку в SHA256
Я считаю, что бэкдор в публичном открытом алгоритме, как SHA256, очень маловероятно. Он должен быть скрыт в простом виде. Тем не менее, даже если один существовал использование двойного хэша может только обеспечить защиту в первом сценарии прообраза. Подобно указанным выше причинам, во втором сценарии прообраза вход известен и, следовательно, противник может выделить две стадии.