Средний Урок 4 4 мин чтения

Цифровые подписи: доказать, не раскрывая

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

Подпись на бумаге всегда одинаковая. Вы тренировались, чтобы она получалась одинаковой каждый раз, и именно из этой повторяемости она черпает свою авторитетность. Цифровая подпись — это противоположность: если она получается одинаковой дважды, что-то серьезно не так — и в конце этого урока вы увидите, сколько денег уже было потеряно именно так.

Подписывать в Bitcoin означает производить два числа из трех вещей: вашего приватного ключа, транзакции, которую вы авторизуете, и случайно выбранного числа. Два числа, которые получаются, называются r и s, и именно они путешествуют вместе с транзакцией. Формула, которая их производит, является темой продвинутого курса; то, что она гарантирует, обсуждается здесь.

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

Замок открылся на глазах у всех, и ключ нигде не появился.

Обратите внимание на то, что не получает проверяющий. Он не получает приватный ключ, не получает никакой его части и не может подписать что-либо вместо вас. Подпись не содержит ключ: она является следствием ключа, так же как след является следствием ноги и не позволяет создать ногу.

Второй момент — это то, что именно подписывается, и здесь кроется самое распространенное недоразумение. Подпись в Bitcoin не говорит "я разрешаю этому человеку". Она рассчитывается на основе содержания всей транзакции: монет, которые входят, значений, адресов назначения. Изменение одного сатоши после подписания создает другую транзакцию, для которой эта подпись просто не подходит. Никто не может взять вашу вчерашнюю подпись и использовать ее, чтобы отправить ваши деньги в другое место сегодня.

Печать закрепляет не только последнюю страницу: она закрепляет все. Замена листа нарушает шов.

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

Осталось объяснить случайное число, и это самая уязвимая часть всей схемы. Это число, называемое nonce, должно быть разным и непредсказуемым для каждой подписи. Если один и тот же ключ подписывает два разных документа, используя один и тот же nonce, две подписи становятся системой из двух уравнений, и приватный ключ можно извлечь из нее с помощью школьной алгебры.

Это не гипотеза. В декабре 2010 года на конгрессе Chaos Computer Club в Берлине группа fail0verflow показала, что Sony использовала постоянный nonce для подписания программ PlayStation 3: ключ, который авторизовал все программное обеспечение консоли, был публично выведен. В августе 2013 года ошибка в генераторе случайных чисел Android заставила кошельки Bitcoin повторять nonces, не замечая этого; пострадавшие адреса были очищены теми, кто искал в blockchain именно это.

Две одинаковые подписи на разных документах: так падает приватный ключ.

Математика никогда не подводила. Подводили реализации, и разница между этими двумя вещами будет подробно рассмотрена в продвинутом курсе. С 2021 года Bitcoin также принимает второй тип подписи, подпись Шнорра, которая короче и обладает свойством, которого не было у старой — несколько подписей могут быть объединены в одну. Это тема другого модуля.

Вы уже знаете, что приватный ключ — это число, что публичный ключ происходит от него, что адрес происходит от публичного ключа, и что подпись доказывает владение, ничего не показывая. Остался вопрос, который поддерживает все это: почему никто просто не пробует все числа, пока не найдет ваш? В следующем уроке — размер 2^256.