Перейти к содержанию

Secp256k1

Материал из BitcoinWiki

secp256k1 — стандартизированная эллиптическая кривая, которую Bitcoin использует в криптографии с открытым ключом. Это один из наборов доменных параметров, опубликованных Standards for Efficient Cryptography Group в SEC 2.[1]

Кривая определена над простым полем с p = 2^256 − 2^32 − 977 уравнением y^2 = x^3 + 7. SEC 2 также задаёт генератор G, его простой порядок n и кофактор 1. Название обозначает эти параметры, а не формат подписи или кодирование.

Доменные параметры

В обозначениях SEC sec указывает на стандарты, p — на кривую над простым полем, 256 — на размер поля, k — на связь с кривыми Коблица, а 1 — на порядковый номер. SEC 2 оценивает уровень стойкости в 128 бит и задаёт следующие точные значения:[1]

Параметр Значение
p FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a, b 0, 7
сжатый G 0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
n FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h 1

Связанная с кривыми Коблица структура допускает специальную арифметику, включая эффективно вычислимый эндоморфизм. libsecp256k1 сочетает такие методы с предвычисленными таблицами и другими оптимизациями. Производительность зависит от реализации, поэтому универсальный процент ускорения из этого не следует.[2]

Ключи и подписи

Закрытый ключ Bitcoin — скаляр в допустимом диапазоне, заданном порядком кривой. Соответствующий открытый ключ — точка кривой, полученная умножением генератора на скаляр. Безопасность опирается на практическую невозможность восстановить закрытый скаляр из открытой точки.

Исторически Bitcoin применял ECDSA над secp256k1. Taproot ввёл подписи Шнорра BIP 340 над той же кривой. BIP 340 задаёт кодирование, использует открытые ключи только с координатой x и определяет требования к детерминированному созданию nonce.[3]

SEC 1 представляет открытую точку в сжатом виде префиксом 02 или 03 и координатой x, либо в несжатом виде префиксом 04 и обеими координатами.[4] 32-байтовые открытые ключи BIP 340 только с координатой x — отдельное соглашение Bitcoin, которое нельзя смешивать с представлениями SEC 1.

Иерархические детерминированные кошельки BIP 32 также получают дочерние закрытые и открытые ключи с помощью secp256k1. Расширенные ключи содержат chain code и метаданные и обычно сериализуются через Base58Check; это отдельный от операций кривой текстовый слой.[5]

Реализация

Корректная реализация проверяет скаляры и точки, безопасно создаёт nonce, защищается от побочных каналов и строго разбирает подписи и ключи. Bitcoin Core использует libsecp256k1, реализующую ECDSA, совместимые с BIP 340 подписи Шнорра и код с постоянным временем для зависящих от секрета операций.[2]

secp256k1 не шифрует файлы кошелька, не хранит ключи и сама по себе не создаёт адрес. Хеширование, скрипты, сетевые идентификаторы и кодирование образуют дополнительные слои.

См. также

Примечания