本文へスキップ
ecdsa.com

secp256k1

SEC 2 で定められた 256 ビットの Koblitz 楕円曲線 y² = x³ + 7 で、Bitcoin が採用し、Ethereum と Nostr でも使われています。セキュリティレベルは約 128 ビットです。
別表記secp256k1 curveBitcoin curveK-256

パラメーター(SEC 2 §2.4.1):p = 2²⁵⁶ − 2³² − 977、a = 0、b = 7、コファクター 1、群の位数は 2²⁵⁶ よりわずかに小さい値です。この特殊な構造により、効率よく計算できる自己準同型写像(GLV)が得られ、スカラー倍算が高速になります。識別子:OID 1.3.132.0.10、JOSE では crv が secp256k1、alg が ES256K(RFC 8812)、COSE では −47 です。TLS 1.3、WebCrypto、Apple の Secure Enclave、ほとんどの HSM のデフォルトプロファイルでは提供されていません。

NIST SP 800-186 の付録 H.2 は、secp256k1 を「ブロックチェーン関連のアプリケーション向け」に認めています。secp256k1 は、Bitcoin の ECDSA 署名と BIP-340 の Schnorr 署名、Ethereum のトランザクション、personal_sign と EIP-712 の署名(リカバリバイト v を含めて 65 バイト)、Nostr のイベントを支えています。

汎用ライブラリでは、この曲線の処理は低速です。同じ Apple M4 Max のコアで、OpenSSL 3.6.5 を使う Node.js 26 は、P-256 では 1 秒あたり約 68,800 件のメッセージに署名するのに対し、secp256k1 では約 6,500 件にとどまります。OpenSSL には secp256k1 向けに最適化されたコードがないためです。libsecp256k1(Bitcoin Core の定数時間ライブラリ)か @noble/curves を使ってください。後者は純粋な JavaScript でありながら、secp256k1 を同ライブラリの P-256 と同じ速さで実行します。low-S や公開鍵の復元といったブロックチェーンの慣習は、汎用の ECDSA とは異なります。P-256 との比較を参照してください。

規格と参考文献

すべての用語