secp256k1
secp256k1 — это эллиптическая кривая, определённая в стандарте Standards for Efficient Cryptography (SEC) и широко используемая в криптографии, в первую очередь в алгоритмах цифровой подписи и протоколах децентрализованных систем. Относится к классу кривых над простыми полями (prime curves) и характеризуется простотой реализации, высокой производительностью и детерминированным выбором параметров, что делает её особенно популярной в блокчейн-технологиях.
История и происхождение
Стандарт SEC был разработан компанией Certicom (США) в 2000 году как набор рекомендаций для использования эллиптических кривых в криптографии. Кривая secp256k1 была одной из нескольких кривых, описанных в документе SEC 2: Recommended Elliptic Curve Domain Parameters. В отличие от многих других кривых, предложенных Национальным институтом стандартов и технологий США (NIST), параметры secp256k1 были выбраны детерминированно — на основе хеш-функции SHA-1, что исключало возможность скрытого ослабления кривой со стороны разработчиков.
Долгое время secp256k1 оставалась малоизвестной и редко применялась на практике. Ситуация изменилась в 2009 году, когда Сатоси Накамото выбрал эту кривую для реализации алгоритма цифровой подписи ECDSA в протоколе биткоина. Причинами выбора стали:
- Детерминированный генератор параметров (отсутствие подозрений о «чёрном ходе»).
- Высокая производительность при вычислениях на 256-битных полях.
- Отсутствие патентных ограничений (кривая не была запатентована).
С ростом популярности биткоина secp256k1 стала стандартом де-факто для многих криптовалют и блокчейн-платформ.
Математические основы
Определение кривой
secp256k1 задаётся уравнением Вейерштрасса в аффинных координатах:
y² = x³ + 7 (mod p)
где p — простое число, равное:
p = 2²⁵⁶ − 2³² − 2⁹ − 2⁸ − 2⁷ − 2⁶ − 2⁴ − 1
В десятичной записи: p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
Параметры кривой
Кривая определяется набором доменных параметров (domain parameters):
| Параметр | Значение | Описание |
|---|---|---|
| p | 115792089237316195423570985008687907853269984665640564039457584007908834671663 | Простое число, модуль поля |
| a | 0 | Коэффициент уравнения (x³ + ax + b) |
| b | 7 | Коэффициент уравнения |
| G | (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8) | Базовая точка (генератор) |
| n | 115792089237316195423570985008687907852837564279074904382605163141518161494337 | Порядок группы (простое число) |
| h | 1 | Кофактор (отношение порядка группы к порядку подгруппы) |
Свойства
- Размер ключа: 256 бит (32 байта) для закрытого ключа, 512 бит (64 байта) для открытого ключа в несжатом формате.
- Стойкость: 128 бит (эквивалентна симметричному шифрованию с ключом 128 бит).
- Кофактор h=1: означает, что порядок группы равен порядку подгруппы, что упрощает вычисления и исключает некоторые атаки.
- Кривая является k-1 кривой: константа b равна 7, что делает её одной из немногих стандартных кривых с таким малым значением.
Криптографические применения
Алгоритм цифровой подписи ECDSA
Основное применение secp256k1 — реализация алгоритма ECDSA (Elliptic Curve Digital Signature Algorithm). Процесс подписи и проверки включает:
- Генерация ключей: закрытый ключ — случайное число от 1 до n-1; открытый ключ — результат умножения закрытого ключа на базовую точку G.
- Подписание: хеш сообщения подписывается с использованием закрытого ключа и случайного числа (nonce).
- Проверка: открытый ключ и подпись позволяют проверить, что подпись была создана владельцем соответствующего закрытого ключа.
Протоколы на основе secp256k1
- Биткоин: используется для создания адресов и подписи транзакций. Каждый биткоин-адрес является хешем открытого ключа, полученного на secp256k1.
- Эфириум: также использует secp256k1 для подписи транзакций и создания аккаунтов.
- Другие криптовалюты: Litecoin, Dogecoin, Monero (до перехода на Ed25519), Zcash и многие другие.
- Протоколы второго уровня: Lightning Network, протоколы атомарных свопов, мультиподписи.
Другие применения
- Системы аутентификации: некоторые VPN-протоколы и системы управления ключами (например, OpenPGP) поддерживают secp256k1.
- Децентрализованные приложения (dApps): смарт-контракты в Эфириуме используют secp256k1 для верификации подписей.
- Схемы разделения секрета: некоторые реализации Shamir’s Secret Sharing используют secp256k1.
Преимущества и недостатки
Преимущества
- Высокая производительность: вычисления на 256-битном поле выполняются быстро на современном оборудовании.
- Детерминированный выбор параметров: отсутствие подозрений о скрытых уязвимостях, в отличие от кривых NIST.
- Поддержка в аппаратном обеспечении: многие криптографические чипы и кошельки оптимизированы для secp256k1.
- Большое сообщество: обширная документация, библиотеки (libsecp256k1, OpenSSL, Botan) и инструменты.
Недостатки
- Отсутствие поддержки парных вычислений (pairing): secp256k1 не является кривой с парным отображением, что ограничивает её применение в некоторых продвинутых протоколах (например, zk-SNARKs).
- Меньшая стандартизация: в отличие от кривых NIST (P-256, P-384), secp256k1 не включена в стандарты FIPS, что может быть проблемой для государственных систем.
- Уязвимость к квантовым атакам: как и все кривые на основе эллиптических кривых, secp256k1 будет взломана при появлении достаточно мощного квантового компьютера (алгоритм Шора).
Реализации и библиотеки
Наиболее известная и широко используемая реализация — libsecp256k1, написанная на языке C и поддерживаемая разработчиками биткоина. Эта библиотека обеспечивает:
- Высокую производительность (оптимизированные ассемблерные вставки для x86_64).
- Поддержку различных форматов ключей (сжатые, несжатые).
- Реализацию ECDSA, а также схем подписи Schnorr (BIP340).
- Защиту от атак по сторонним каналам.
Другие популярные реализации:
- OpenSSL (начиная с версии 1.1.0).
- Botan (кроссплатформенная библиотека).
- Bouncy Castle (Java).
- Elliptic (Node.js).
- secp256k1-py (Python, обёртка над libsecp256k1).
Критика и альтернативы
Основная критика secp256k1 связана с её происхождением: хотя параметры детерминированы, сама кривая была предложена компанией Certicom, которая в прошлом активно патентовала криптографические алгоритмы. Однако в настоящее время все патенты на secp256k1 истекли.
В последние годы наблюдается тенденция перехода на кривые Эдвардса (Ed25519) и кривые Монтгомери (X25519) из-за их более высокой производительности и устойчивости к определённым атакам. Например, Monero и некоторые другие проекты перешли с secp256k1 на Ed25519. Тем не менее, secp256k1 остаётся доминирующей кривой в блокчейн-экосистеме благодаря огромной установленной базе и совместимости с существующими протоколами.
Перспективы
С развитием квантовых вычислений secp256k1, как и все классические криптосистемы на эллиптических кривых, будет заменена на постквантовые алгоритмы. Однако в ближайшие 10–20 лет она останется основой безопасности большинства криптовалют. Кроме того, ведутся работы по интеграции secp256k1 в протоколы с нулевым разглашением (например, через использование специальных доказательств), что может расширить её применение.
Источники
- Certicom Research. "SEC 2: Recommended Elliptic Curve Domain Parameters". Version 2.0, 2010.
- Nakamoto, S. "Bitcoin: A Peer-to-Peer Electronic Cash System". 2008.
- National Institute of Standards and Technology (NIST). "FIPS 186-5: Digital Signature Standard (DSS)". 2023.
- Pieter Wuille. "libsecp256k1: Optimized C library for EC operations on curve secp256k1". GitHub repository.
- Bernstein, D.J. et al. "Ed25519: high-speed high-security signatures". 2011.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →