Блокчейн/Уровень II · Механика/2.1 Криптография/Урок 3
Приватные ключи, публичные ключи и secp256k1
Целое число, кривая и односторонняя дверь
МатериалыОбозреватель блоков, отображающий witness-данныеА. М. Антонопулос и Д. А. Хардинг, Mastering Bitcoin, 3-е изд. (2023), гл. 4
Любопытство
- Почему умножение точки на число занимает миллисекунды, а обратная операция заняла бы больше времени, чем существует Вселенная?
- Чем secp256k1 структурно отличается от кривых NIST, используемых в большинстве других схем цифровой подписи?
- Как 32-байтное значение может контролировать активы стоимостью в миллиарды, не раскрывая, кто ими управляет?
Исследование
- Приватный ключ в биткоине — это случайное целое число от 1 до n−1, где n — порядок точки-генератора кривой. Это число n составляет примерно 1,158 × 10^77 — 78-значное число, ненамного меньше оценочного количества атомов в наблюдаемой Вселенной (около 10^80). Публичный ключ получают скалярным умножением: это целое число k умножают на фиксированную точку-генератор G эллиптической кривой. Поскольку G одна и та же для всех пользователей биткоина, каждое уникальное k даёт уникальную детерминированную точку K на кривой.
- Кривая secp256k1 задаётся уравнением y² = x³ + 7 над простым полем, где p = 2^256 − 2^32 − 977. Этот набор параметров закреплён в стандарте SEC 2 компании Certicom. Выбор secp256k1 в 2009 году был необычным: это кривая Коблица, названная в честь Нила Коблица; её особая структура (эффективно вычислимый эндоморфизм) позволяет ускорить скалярное умножение, а параметры оставляют мало простора для скрытого выбора — в отличие от кривых, сгенерированных из необъяснённых случайных начальных значений. Сатоши Накамото так и не объяснил свой выбор.
- Скалярное умножение выполняется быстро, поскольку реализации используют алгоритм «удвоение и сложение» (double-and-add), обрабатывая двоичное представление приватного ключа бит за битом. Удвоение точки и сложение с другой точкой — базовые операции на кривой, которые компьютер выполняет за микросекунды. Однако обратная операция — нахождение k по K и G — известна как задача дискретного логарифмирования на эллиптической кривой (ECDLP). Эффективный классический алгоритм решения ECDLP на secp256k1 неизвестен; полный перебор пространства ключей вычислительно неосуществим, что обеспечивает примерно 128-битную безопасность против классических атак.
- Публичные ключи сериализуются в определённых форматах для хранения и передачи. Несжатый публичный ключ имеет длину 65 байт: он начинается с префикса 04, за которым следуют координаты x и y. Сжатый публичный ключ занимает 33 байта: префиксы 02 или 03 указывают на чётность координаты y, что позволяет восстановить ключ только по координате x. Taproot, активированный в ноябре 2021 года, использует дальнейшую оптимизацию — x-only ключи длиной 32 байта, которые полностью обходятся без префикса и опираются на свойства схемы подписи Шнорра.
- Связь между приватным и публичным ключами строго односторонняя. Публичный ключ ничего не сообщает о приватном, поскольку задача дискретного логарифмирования для кривой такого размера остаётся нерешённой. И наоборот, владея приватным ключом, можно мгновенно вычислить соответствующий публичный. Эта асимметрия лежит в основе модели владения в биткоине: любой может проверить, что подпись создана определённым приватным ключом, ни разу не увидев сам ключ.
- Чтобы проверить эти механизмы, откройте любой обозреватель блоков и найдите вход транзакции. При трате нативного SegWit-выхода (P2WPKH) witness содержит подпись и 33-байтный сжатый публичный ключ; при трате Taproot по пути ключа (key path) 32-байтный ключ находится в самом выходе, а witness содержит только подпись. Сравните это с адресом в предыдущем выходе: адрес — это хеш публичного ключа, а здесь, при трате, появляется сам ключ в исходном виде. Обратите внимание: координаты публичного ключа — это шестнадцатеричные строки, представляющие точки на кривой, и они отличаются от 20- и 32-байтных хешей, используемых в адресах SegWit версии 0.
Ключевые факты
- Частный ключ — это случайное целое число от 1 до n−1, где n ≈ 1.158 × 10^77.
- secp256k1 задаётся уравнением y² = x³ + 7 над простым полем p = 2^256 − 2^32 − 977.
- Скалярное умножение k·G даёт публичный ключ; обратная операция (ECDLP) вычислительно неосуществима.
- Несжатые публичные ключи занимают 65 байт (префикс 04); сжатые — 33 байта (префикс 02/03).
- Taproot использует 32-байтные x-only ключи, полностью отбрасывая координату y и префикс.
- secp256k1 — это кривая Коблица с небольшим количеством необъяснённых параметров, выбранная Сатоши в 2009 году.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 свойств secp256k1: её уравнение, простое число, задающее поле, порядок точки-генератора, размеры ключей (несжатый/сжатый/x-only), уровень безопасности, происхождение стандарта, тип кривой и два исторических факта о её внедрении.
6СгруппироватьРазделите 9 пунктов на 6 групп: уравнение и поле, генератор и порядок, форматы ключей, уровень безопасности, история стандартов и внедрение.
3Выделить главноеСведите 6 групп к 3 причинам, по которым secp256k1 подходит для модели владения в биткоине.
1КристаллизоватьНапишите одно предложение, в котором назовите точную математическую операцию, превращающую приватное целое число в публичную точку, и укажите задачу, которая не позволяет обратить эту операцию.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.