Открыть сервис

libsecp256k1

libsecp256k1 — это программная библиотека на языке C, реализующая операции с эллиптической кривой secp256k1. Разработана и поддерживается организацией Bitcoin Core (проект с открытым исходным кодом, не имеет статуса запрещённой организации в РФ). Библиотека обеспечивает высокопроизводительные и безопасные криптографические вычисления, включая генерацию ключей, создание и проверку цифровых подписей по алгоритму ECDSA (Elliptic Curve Digital Signature Algorithm) и Schnorr, а также выполнение операций с открытыми ключами. libsecp256k1 является ключевым компонентом многих реализаций протокола Биткойн и других криптовалют, использующих кривую secp256k1.

История

Разработка libsecp256k1 началась в 2013 году в рамках проекта Bitcoin Core. Основной целью было создание высокопроизводительной и тщательно проверенной реализации криптографических операций для кривой secp256k1, которая могла бы заменить менее эффективные и потенциально уязвимые реализации, используемые в ранних версиях клиента Биткойна. Первый стабильный релиз библиотеки состоялся в 2014 году. С тех пор libsecp256k1 активно развивается, в неё были добавлены поддержка подписей Шнорра (в рамках стандарта BIP340), оптимизации для различных архитектур процессоров (включая ARM и x86-64) и улучшенные механизмы защиты от атак по сторонним каналам.

Кривая secp256k1

secp256k1 — это эллиптическая кривая, определённая в стандарте SEC (Standards for Efficient Cryptography) от Certicom. Она задаётся уравнением \( y^2 = x^3 + 7 \) над конечным полем простого порядка. Кривая secp256k1 была выбрана для использования в Биткойне из-за её высокой эффективности и относительной простоты реализации, а также из-за того, что она не была подвержена патентам, которые могли бы ограничить её использование. Параметры кривой включают:

  • Простое поле p: 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
  • Порядок группы n: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
  • Коэффициент a: 0
  • Коэффициент b: 7
  • Генератор G: (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

Архитектура и возможности

libsecp256k1 написана на чистом C с минимальными зависимостями. Она использует модульную архитектуру, где каждый модуль отвечает за определённый набор операций:

  • Модуль полей (field): реализует арифметику в конечном поле простого порядка. Включает оптимизированные реализации для различных архитектур (например, с использованием 64-битных целых чисел или ассемблерных вставок для x86-64).
  • Модуль скаляров (scalar): реализует арифметику с числами по модулю порядка группы n.
  • Модуль групповых операций (group): реализует сложение и удвоение точек на кривой, а также умножение точки на скаляр.
  • Модуль ECDSA: реализует создание и проверку подписей ECDSA.
  • Модуль Schnorr: реализует подписи Шнорра в соответствии с BIP340.
  • Модуль восстановления открытого ключа: позволяет восстановить открытый ключ из подписи ECDSA.
  • Модуль контекста: управляет состоянием библиотеки, включая настройки безопасности и оптимизации.

Основные возможности

  • Генерация ключей: создание пар закрытый/открытый ключ.
  • Создание подписей: ECDSA и Schnorr (BIP340).
  • Проверка подписей: ECDSA и Schnorr.
  • Восстановление открытого ключа: из подписи ECDSA.
  • Операции с открытыми ключами: проверка валидности, сложение, умножение.
  • Сериализация и десериализация: ключей, подписей, точек.
  • Защита от атак по сторонним каналам: библиотека использует константное время выполнения для критических операций, чтобы предотвратить утечку информации через время выполнения, потребление энергии или электромагнитное излучение.

Применение

libsecp256k1 является основным криптографическим компонентом в следующих проектах:

  • Bitcoin Core: основная реализация Биткойна использует libsecp256k1 для всех операций с эллиптической кривой, включая подписание транзакций и проверку подписей.
  • Другие криптовалюты: многие криптовалюты, основанные на Биткойне (например, Litecoin, Dogecoin, Zcash), также используют secp256k1 и, соответственно, libsecp256k1 или её форки.
  • Библиотеки для разработчиков: libsecp256k1 используется в качестве низкоуровневой криптографической библиотеки в таких проектах, как libbitcoin, bitcoinjs-lib (JavaScript), rust-bitcoin (Rust) и других.
  • Аппаратные кошельки: многие аппаратные кошельки (например, Trezor, Ledger) используют libsecp256k1 для выполнения криптографических операций на устройстве.
  • Исследования и образование: библиотека часто используется в учебных целях и для исследований в области криптографии и безопасности блокчейна.

Безопасность

libsecp256k1 разрабатывается с акцентом на безопасность. Код проходит тщательное рецензирование (code review) и аудит. Библиотека использует константное время выполнения для критических операций, что затрудняет проведение атак по сторонним каналам (timing attacks). Также реализованы меры защиты от атак, связанных с ошибками вычислений (fault attacks). Регулярно выпускаются обновления, исправляющие обнаруженные уязвимости. Библиотека поддерживается командой разработчиков Bitcoin Core и сообществом.

Критика

Основная критика libsecp256k1 связана с её сложностью и узкой специализацией. Библиотека реализует только одну кривую (secp256k1) и не поддерживает другие распространённые кривые, такие как secp256r1 (P-256) или Curve25519. Это ограничивает её применение в проектах, требующих поддержки нескольких кривых. Кроме того, код библиотеки написан на C, что может быть менее удобным для интеграции с языками более высокого уровня, хотя существуют обёртки (bindings) для многих языков программирования.

Интересные факты

  • Название библиотеки происходит от стандарта SEC (Standards for Efficient Cryptography) и параметра k (коэффициент кривой) и p (простое поле).
  • Размер библиотеки (скомпилированной) составляет менее 100 КБ, что делает её пригодной для использования во встраиваемых системах.
  • libsecp256k1 была одной из первых библиотек, реализовавших подписи Шнорра для кривой secp256k1 в соответствии с BIP340.

Источники

  • Bitcoin Core. libsecp256k1. GitHub repository.
  • Standards for Efficient Cryptography (SEC) 2: Recommended Elliptic Curve Domain Parameters. Certicom Corp.
  • Bitcoin Improvement Proposal 340 (BIP340): Schnorr Signatures for secp256k1.
  • Официальная документация libsecp256k1.
  • Анализ безопасности и аудит libsecp256k1.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →