Перейти к содержимому
buybitcoinsmart

Глоссарий / Транзакции и комиссии

Цифровая подпись

Другие названия: Подпись, подпись ECDSA.

Что такое Цифровая подпись?
Цифровая подпись является доказательством, созданным с помощью приватного ключа, того, что тот, кто авторизовал транзакцию биткоина, распоряжался ключом, к которому были привязаны ее монеты, и того, что детали не были изменены.

Биткоин больше не использует только ECDSA. Биткоины на адресах, начинающихся с 1, 3 или bc1q, разблокируются подписями ECDSA длиной 71 или 72 байта; биткоины на адресах bc1p используют подписи Schnorr длиной 64 байта, действующие с ноября 2021 года. В любом случае подпись доказывает распоряжение ключом и никогда не доказывает, кем является человек.

Как это работает

Для создания подписи нужны три составляющие: приватный ключ, одноразовое случайное число, называемое nonce, и хеш транзакции в том виде, в каком он обрезан флагом, выбранным для этого входа.

Результат представляет собой пару чисел, вычисленных на кривой secp256k1, эллиптической кривой, которую биткоин использует с самого первого выпуска. Проверка выполняет ту же арифметику в обратном порядке с использованием публичного ключа, и узел выполняет ее внутри кода операции скрипта OP_CHECKSIG. Ни на одном этапе ничего не шифруется, и подпись ничего не раскрывает о приватном ключе, стоящем за ней.

Две используемые схемы упаковывают эту пару по-разному. Подпись ECDSA обернута в DER, поэтому она занимает 71 или 72 байта, а не фиксированную длину, и последний байт вообще не является частью подписи: это флаг, указывающий, какие части транзакции покрыты. Подпись Schnorr по BIP340 занимает ровно 64 байта без обертки, а байт флага полностью опускается, когда применяется значение по умолчанию, поэтому 65 байт появляются только тогда, когда подписывающий хочет чего-то необычного.

Именно nonce и становится источником проблем. Используйте один и тот же дважды с одним и тем же ключом, и приватный ключ вычисляется школьной алгеброй, и это не теоретическая тревога: 11 августа 2013 года bitcoin.org опубликовал предупреждение об ошибке Android, из-за которой кошельковые приложения на затронутых смартфонах генерировали повторяющиеся значения, и в результате биткоины были украдены. Теперь кошельки выводят nonce детерминированно из ключа и сообщения, следуя RFC 6979 для ECDSA и эквивалентному правилу внутри BIP340.

Где это видно

Каждый ваш расход содержит как минимум одну подпись. В обозревателе блоков это длинная шестнадцатеричная строка в witness входа segwit или в скрипте разблокировки входа старого формата, а завершающий 01 у подписей ECDSA является флагом, а не частью математики.

Подписи работают и вне транзакций. Подпись простого сообщения ключом, стоящим за адресом, доказывает, что вы распоряжаетесь этим адресом, не перемещая ни одного сатоши; так биржи проверяют адрес вывода, так составляются подтверждения резервов (Proof of Reserves) и так продавец на одноранговой площадке показывает, что адрес действительно его. Исходный формат работал только для адресов, начинающихся с 1; BIP322 распространяет подпись сообщений на все типы адресов, используемые сегодня.

Это различие важно всякий раз, когда кто-то просит вас что-то подписать. Подписанное сообщение не может переместить биткоины. Подпись транзакции может переместить их все, и единственный надежный способ узнать, о какой из них просят, состоит в том, чтобы прочитать экран аппаратного кошелька, а не сайта.

Цифровая подпись vs хеш подписи

Хеш подписи является входным значением; подпись является выходным. Ваш кошелек сначала строит хеш, покрывающий определенное подмножество транзакции, затем подписывает этот хеш, поэтому подпись ничего не говорит о частях, которые хеш оставил вне себя. Это не техническая формальность. Именно в этом причина существования флагов sighash, и это объясняет, как две подписи одной транзакции могут защищать совершенно разные вещи.

Не путать с

Часто задаваемые вопросы

Доказывает ли подпись биткоина личность того, кто ее создал?

Нет. Она доказывает, что тот, кто ее создал, распоряжался определенным приватным ключом на тот момент. Ключи передают, крадут и наследуют, поэтому действительная подпись является свидетельством о ключе и никогда о человеке.

Безопасно ли подписывать сообщение, которое мне кто-то присылает?

Подпись простого текстового сообщения не может переместить ваши биткоины, но подпись транзакции может переместить их все. Никогда не подтверждайте на экране аппаратного кошелька ничего из того, что показывает суммы или адреса, если вам говорили, что вы подписываете только сообщение.

Использует ли биткоин до сих пор ECDSA?

Да, для всех адресов, начинающихся с 1, 3 или bc1q, где хранится большинство монет в обращении. Адреса Taproot, начинающиеся с bc1p, вместо этого используют подписи Schnorr, поэтому обе схемы работают параллельно, и многие кошельки создают обе.

Читайте далее

Связанные термины

Еще в разделе «Транзакции и комиссии»

Читать эту страницу на английском