主流椭圆曲线对比 — secp256k1 / Curve25519 / BN254 / BLS12-381
4 条曲线参数/形式/嵌入度/安全级别/pairing-friendly 性,对比 BN254 vs BLS12-381 vs BLS12-377
日期: 2026-11-01 方向: 密码学数学 阶段: Phase 4 - 密码学数学基础 (Day 181-194) 标签: #密码学 #椭圆曲线 #pairing #BLS12-381 #secp256k1
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | 4 条曲线参数/形式/嵌入度/安全级别/pairing-friendly 性,对比 BN254 vs BLS12-381 vs BLS12-377 |
| 实操 | 制表对比安全/性能/用途;推导嵌入度公式 |
| 产出 | curves.md — 曲线选型决策表 |
一、动机
不同协议选不同曲线:
- Bitcoin / Ethereum 账户签名 → secp256k1 (无 pairing 需求)
- Signal / TLS / SSH → Curve25519 (高效 + 安全)
- 早期 zkSNARKs / Ethereum precompile → BN254 (pairing-friendly)
- 现代 ZK / EIP-2537 → BLS12-381 (更高安全级别)
选择曲线 = 选安全级别 / 性能 / pairing 能力 / 实现复杂度的折中。
二、曲线分类
2.1 按形式
| 形式 | 方程 | 例 |
|---|---|---|
| 短 Weierstrass | $y^2 = x^3 + ax + b$ | secp256k1, BN254, BLS12-381 |
| Montgomery | $By^2 = x^3 + Ax^2 + x$ | Curve25519 (montgomery 形式 of x25519) |
| Edwards | $x^2 + y^2 = 1 + d x^2 y^2$ | Ed25519 (twisted Edwards), Jubjub |
2.2 按 pairing 能力
| 类型 | 嵌入度 $k$ | 用途 |
|---|---|---|
| 普通 EC | $k$ 巨大 (无实际 pairing) | DH/DSA/Schnorr |
| Pairing-friendly | $k$ 小 (6,12,24...) | BLS sig, KZG, Groth16 |
嵌入度定义:$k$ 是最小整数使 $n \mid p^k - 1$,其中 $n$ 是子群阶。它决定 pairing 输出域 $\mathbb{F}_{p^k}$。
三、严格对比
3.1 secp256k1
| 参数 | 值 |
|---|---|
| 形式 | $y^2 = x^3 + 7$ |
| $p$ | $2^{256} - 2^{32} - 977$ |
| $n$ (子群阶) | $\approx 2^{256}$ 大素数 |
| 余因子 $h$ | $1$ |
| 安全级别 | 128 bit |
| 嵌入度 | $\sim 2^{255}$(极大,无实用 pairing) |
| 设计来源 | SECG, Koblitz curve (有 endomorphism, 加速 25%) |
| 用途 | Bitcoin, Ethereum, Lightning, BIP340 Schnorr |
特点:$a=0$ 让 doubling 公式简化;GLV endomorphism $\phi(x,y) = (\beta x, y), \beta^3 = 1$ 加速标量乘。
3.2 Curve25519 / Ed25519
| 参数 | 值 |
|---|---|
| 形式 | Montgomery: $y^2 = x^3 + 486662 x^2 + x$<br>Twisted Edwards (Ed25519): $-x^2 + y^2 = 1 - (121665/121666) x^2 y^2$ |
| $p$ | $2^{255} - 19$ |
| $n$ | $2^{252} + \dots$(253 bit 素数) |
| 余因子 $h$ | $8$ |
| 安全级别 | 128 bit |
| 嵌入度 | $\sim 2^{250}$(无 pairing) |
| 设计来源 | Bernstein 2005 |
| 用途 | TLS 1.3, SSH, Signal, Tor, X25519 KEX |
特点:
- $p = 2^{255}-19$ 让模约简极快(special form)
- Montgomery ladder 天然恒定时间
- Edwards 形式加法公式无分支
- $h=8$ 需要私钥 clamp(清低 3 bit + 设第 254 bit)
3.3 BN254 (Barreto-Naehrig)
| 参数 | 值 |
|---|---|
| 形式 | $y^2 = x^3 + 3$ |
| $p$ | 254-bit, $p = 36u^4 + 36u^3 + 24u^2 + 6u + 1$, $u = 0x44E992B44A6909F1$ |
| $n$ | 254-bit |
| 嵌入度 | $k = 12$ |
| 安全级别 | ~100 bit (不再 128 bit, 因 NFS 改进) |
| 用途 | 历史 Ethereum precompile (EIP-196/197), 早期 Zcash |
为什么不再用:
- 2016 Kim-Barbulescu 改进了 Tower NFS,攻击 $\mathbb{F}_{p^{12}}$ DLP
- 实际安全降到 ~100 bit
- 现代项目迁移到 BLS12-381
3.4 BLS12-381
| 参数 | 值 |
|---|---|
| 形式 | $y^2 = x^3 + 4$ over $\mathbb{F}p$<br>Twist: $y^2 = x^3 + 4(u+1)$ over $\mathbb{F}{p^2}$ |
| $p$ | 381-bit, $p = (u-1)^2(u^4 - u^2 + 1)/3 + u$, $u = -0xD201000000010000$ |
| $r$ (子群阶) | 255-bit 素数 |
| 嵌入度 | $k = 12$ |
| 安全级别 | 128 bit (调整 NFS 后仍达标) |
| 设计 | Bowe 2017 / Sean Bowe for Zcash Sapling |
| 用途 | Zcash Sapling, Ethereum 2.0 BLS sig, Filecoin, Plonk/Groth16 |
结构:
- $\mathbb{G}_1 \subset E(\mathbb{F}_p)$:381-bit 字段,254-bit 子群
- $\mathbb{G}2 \subset E'(\mathbb{F}{p^2})$:twist 上的子群
- $\mathbb{G}T \subset \mathbb{F}{p^{12}}^*$:pairing 输出
- Pairing $e: \mathbb{G}_1 \times \mathbb{G}_2 \to \mathbb{G}_T$
3.5 BLS12-377 (Aleo / Celo)
| 参数 | 值 |
|---|---|
| $p$ | 377-bit |
| 嵌入度 | $12$ |
| 用途 | Aleo (zkML), Celo, "outer curve" of recursion |
关键特性:BLS12-377 嵌入 BW6-761 (Bowe-Williams),支持递归 SNARK(证明的证明)。
四、嵌入度 $k$ 的推导
定义:嵌入度 $k = \min{i \ge 1 : n \mid p^i - 1}$,$n$ 子群阶。
为什么重要:
- 椭圆曲线的 $n$-torsion $E[n]$($n$ 阶元素的子群)在 $\mathbb{F}p$ 上只占一部分;要看到完整的 $E[n] \cong \mathbb{Z}/n \times \mathbb{Z}/n$,需要扩到 $\mathbb{F}{p^k}$
- Pairing $e: E[n] \times E[n] \to \mu_n \subset \mathbb{F}_{p^k}^*$
- 所以 $k$ 越小,pairing 计算越便宜,但 DLP 在 $\mathbb{F}_{p^k}^*$ 上越脆弱
MOV 攻击 (Menezes-Okamoto-Vanstone 1993):把 EC 上 ECDLP 转移到 $\mathbb{F}_{p^k}^*$ 上 DLP。所以小 $k$ 的曲线(如 supersingular)虽然 pairing 友好但安全弱。
平衡:要让 $\mathbb{F}_{p^k}^*$ 中 DLP 与 EC 上 ECDLP 难度匹配。
- 128-bit 安全:ECDLP 需 $n \approx 2^{256}$;$\mathbb{F}_{p^k}^*$ DLP 需 $p^k \approx 2^{3000}$(NFS)
- $k=12$,$p \approx 256$ → $p^{12} \approx 2^{3072}$ ✓
这就是为什么 $k=12$ 是 sweet spot。
五、Pairing-friendly 曲线家族
| 家族 | $\rho = \log p / \log n$ | $k$ | 例 |
|---|---|---|---|
| MNT | varies | 4, 6 | MNT4-298, MNT6-298 |
| BN | $\rho \approx 1$ | 12 | BN254, BN382 |
| BLS | $\rho \approx 1.5$ | 12, 24, 48 | BLS12-381, BLS24-315 |
| KSS | $\rho \approx 1.6-1.9$ | 18 | KSS18 |
| BW | $\rho \approx 1.5$ | 6 | BW6-761 (递归 of BLS12-377) |
$\rho = 1$ 是理想(field size = 子群 size),BN 是 $\rho \approx 1$。BLS 略大但更安全。
六、决策表
6.1 应用 → 曲线推荐
| 场景 | 推荐 | 原因 |
|---|---|---|
| 比特币/EVM 签名 | secp256k1 | 历史兼容,128-bit 安全 |
| 现代 TLS/SSH | Ed25519 | 简单实现安全,性能好 |
| BLS 聚合签名 (Eth2) | BLS12-381 | 128-bit pairing-friendly |
| 通用 SNARK (Groth16/Plonk) | BLS12-381 | 工具链成熟 |
| 递归 SNARK | BLS12-377 ↔ BW6-761 | 嵌套结构 |
| FRI/STARK (无 pairing) | Goldilocks $\mathbb{F}_p, p=2^{64}-2^{32}+1$ | 64-bit field 高速 |
| 旧合约 ZK | BN254 (alt_bn128) | EIP-196/197 兼容 |
6.2 性能对比 (粗略,128-bit security)
| 操作 | secp256k1 | Ed25519 | BN254 | BLS12-381 |
|---|---|---|---|---|
| 标量乘 (us) | ~30 | ~50 | ~80 | ~200 |
| Pairing (ms) | N/A | N/A | ~3 | ~5-10 |
| 公钥大小 (压缩) | 33 bytes | 32 bytes | 32 bytes ($\mathbb{G}_1$) / 64 ($\mathbb{G}_2$) | 48 bytes ($\mathbb{G}_1$) / 96 ($\mathbb{G}_2$) |
| 签名大小 | 64 bytes | 64 bytes | - | 96 bytes (BLS) |
七、代码:曲线信息结构
"""
Day 184: 椭圆曲线参数库
"""
from dataclasses import dataclass
@dataclass
class CurveInfo:
name: str
form: str
p_bits: int
n_bits: int
cofactor: int
embedding_degree: int
security_bits: int
pairing_friendly: bool
use_cases: list[str]
CURVES = {
"secp256k1": CurveInfo(
name="secp256k1",
form="y² = x³ + 7",
p_bits=256,
n_bits=256,
cofactor=1,
embedding_degree=10**70, # effectively infinite
security_bits=128,
pairing_friendly=False,
use_cases=["Bitcoin", "Ethereum signing", "BIP340 Schnorr"],
),
"Curve25519": CurveInfo(
name="Curve25519",
form="y² = x³ + 486662 x² + x (Montgomery)",
p_bits=255,
n_bits=253,
cofactor=8,
embedding_degree=10**70,
security_bits=128,
pairing_friendly=False,
use_cases=["TLS 1.3", "SSH", "Signal", "Tor", "Ed25519"],
),
"BN254": CurveInfo(
name="BN254 (alt_bn128)",
form="y² = x³ + 3",
p_bits=254,
n_bits=254,
cofactor=1,
embedding_degree=12,
security_bits=100, # post-NFS attack
pairing_friendly=True,
use_cases=["Ethereum precompile EIP-196/197", "Old Zcash"],
),
"BLS12-381": CurveInfo(
name="BLS12-381",
form="y² = x³ + 4",
p_bits=381,
n_bits=255,
cofactor=0x396c8c005555e1568c00aaab0000aaab, # 76-bit
embedding_degree=12,
security_bits=128,
pairing_friendly=True,
use_cases=["Eth2 BLS sig", "Zcash Sapling", "Filecoin", "Plonk"],
),
"BLS12-377": CurveInfo(
name="BLS12-377",
form="y² = x³ + 1",
p_bits=377,
n_bits=253,
cofactor=0x170b5d44300000000000000000000000,
embedding_degree=12,
security_bits=128,
pairing_friendly=True,
use_cases=["Aleo", "Celo", "Recursive SNARKs (with BW6-761)"],
),
}
def print_comparison():
cols = ["name", "p_bits", "n_bits", "cofactor", "k", "sec", "pairing"]
print(f"{'Curve':20} {'p':>6} {'n':>6} {'h':>10} {'k':>6} {'sec':>6} {'pair':>6}")
print("-" * 70)
for c in CURVES.values():
h_str = f"2^{c.cofactor.bit_length()-1}" if c.cofactor > 1000 else str(c.cofactor)
k_str = "∞" if c.embedding_degree > 1000 else str(c.embedding_degree)
print(f"{c.name:20} {c.p_bits:>6} {c.n_bits:>6} {h_str:>10} {k_str:>6} {c.security_bits:>6} {str(c.pairing_friendly):>6}")
if __name__ == "__main__":
print_comparison()
八、密码学应用关联
8.1 BLS 签名(基于 BLS12-381)
- 公钥 $pk = sk \cdot G_2 \in \mathbb{G}_2$
- 签名 $\sigma = sk \cdot H(m) \in \mathbb{G}_1$($H$: hash-to-curve)
- 验证:$e(\sigma, G_2) \stackrel{?}{=} e(H(m), pk)$
聚合:$\sigma = \sum_i \sigma_i \in \mathbb{G}_1$,$pk = \sum_i pk_i \in \mathbb{G}_2$。这是 Eth2 共识层关键能力(每 slot 数千签名聚合成一个)。
8.2 KZG 多项式承诺(基于 BLS12-381)
- 承诺 $C = [p(\tau)]_1 = p(\tau) \cdot G_1$($\tau$ 来自 trusted setup)
- 证明 $p(z) = y$:$\pi = [(p(\tau)-y)/(\tau-z)]_1$
- 验证:$e(\pi, [\tau-z]_2) = e(C - [y]_1, G_2)$
8.3 Groth16 验证 (~3 pairings)
最终步骤:检验 $e(A, B) = e(\alpha, \beta) \cdot e(L, \gamma) \cdot e(C, \delta)$。在 EVM 用 BN254 precompile 直接做。
九、真实参数
# secp256k1
P_K1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
N_K1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
# Curve25519
P_25519 = 2**255 - 19
N_25519 = 2**252 + 27742317777372353535851937790883648493
# BN254 / alt_bn128
P_BN = 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47
N_BN = 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001
# BLS12-381
P_BLS = 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
R_BLS = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
十、常见陷阱
- BN254 误以为 128-bit 安全:旧文档/EIP 写 128 bit,实际后 NFS 改进只剩 ~100 bit。新协议应迁 BLS12-381。
- Curve25519 余因子 8 忘 clamp:导致 small subgroup attack。X25519 协议规范已 baked-in clamp。
- 混淆 BLS 算法 vs BLS 曲线:BLS 签名是 Boneh-Lynn-Shacham;BLS 曲线是 Barreto-Lynn-Scott。两个不同三人组!很多人混淆。
- 公钥放在 $\mathbb{G}_1$ 还是 $\mathbb{G}_2$ 是约定问题:Eth2 把 pubkey 放 $\mathbb{G}_1$(48 bytes),sig 放 $\mathbb{G}_2$(96 bytes),优化签名快+公钥小。而 BLS 论文原版相反。这造成跨实现兼容问题(参见 IETF draft-irtf-cfrg-bls-signature)。
- 嵌入度 1:supersingular 曲线 $k=2$ 极小,pairing 极快,但安全极弱(MOV 攻击直接打)。所以"pairing-friendly"必须 $k \ge 6$ 或更大。
- 二进制/三元曲线:$\mathbb{F}_{2^n}$ 上曲线(曾用于嵌入式)后来发现弱(Diem 攻击),现已弃。
十一、关键速查
安全级别对照
| Sec bits | RSA | DH ($\mathbb{F}_p$) | ECC | 对称 | Hash |
|---|---|---|---|---|---|
| 128 | 3072 | 3072 | 256 | AES-128 | SHA-256 |
| 192 | 7680 | 7680 | 384 | AES-192 | SHA-384 |
| 256 | 15360 | 15360 | 512 | AES-256 | SHA-512 |
嵌入度选型
- $k = 1, 2$:太弱(MOV)
- $k = 6, 8$:可用但不流行
- $k = 12$:sweet spot,多数 ZK 用
- $k = 24, 48$:高安全,BLS24/48 实验性
十二、面试题
Q1: 为什么 Ethereum 从 BN254 迁移到 BLS12-381?
答:
- 安全性:Tower NFS 攻击让 BN254 的 $\mathbb{F}_{p^{12}}$ DLP 安全降到 ~100 bit。BLS12-381 的 $p$ 字段 381 bit,安全保持 128 bit。
- 聚合签名需求:Eth2 共识用 BLS 签名聚合,每 slot 数千签名聚成一个。BLS 协议天然在 BLS12-381 上设计。
- EIP-2537 引入 BLS12-381 precompile(预编译合约),让 EVM 高效验证 BLS 签名 + KZG 证明(EIP-4844 Blob 用)。
- 生态共识:Zcash Sapling、Filecoin、Aleo 都用 BLS12-381,工具链成熟。
Q2: 嵌入度 $k=12$ 为什么是黄金中庸?
答:要让两个 DLP 难度匹配。
- ECDLP 难度 $\sim 2^{n/2}$(Pollard rho),$n = 256 \Rightarrow 128$ bit
- $\mathbb{F}_{p^k}^*$ DLP 难度 $\exp(O((k\log p)^{1/3}))$(NFS),需 $k\log p \approx 3000$
- $k=12, \log p = 256 \Rightarrow 3072$ bit ✓
$k$ 太小(如 6)需 $p \approx 512$ bit,pairing 慢;$k$ 太大(24, 48)pairing 输出域 $\mathbb{F}{p^{24}}, \mathbb{F}{p^{48}}$ 计算昂贵。
Q3: secp256k1 与 Ed25519 选型如何决策?
答:
- secp256k1:兼容比特币/EVM、BIP-340 Schnorr 已标准化、有 GLV endomorphism
- Ed25519:恒定时间天然实现、模约简快 ($p=2^{255}-19$)、签名/公钥更小
- 生态:金融 / 区块链 → secp256k1;通用安全 / SSH/TLS → Ed25519
- 不适合 ZK:两者都不 pairing-friendly
Q4: 什么是 twist,为什么 BLS12-381 用 twist 优化?
答:曲线 $E: y^2 = x^3 + 4$ 在 $\mathbb{F}_{p^2}$ 上有同构变换 (twist) 到 $E': y^2 = x^3 + 4(u+1)$,$u^2 = -1$。
- 不用 twist:$\mathbb{G}2$ 点坐标在 $\mathbb{F}{p^{12}}$(每点 $12 \cdot 381 = 4572$ bit)
- 用 twist (degree 6, sextic twist):$\mathbb{G}2$ 在 $\mathbb{F}{p^2}$ 表达(每点 $2 \cdot 381 = 762$ bit)
- 节省 6 倍存储、计算
twist 对 BN/BLS 类曲线是必需优化。
Q5: 为什么 secp256k1 没有 pairing 应用?
答:嵌入度 $k$ 巨大($\sim 2^{255}$),意味着 $\mathbb{F}{p^k}$ 大到无法计算。要做 pairing $e(P, Q) \in \mathbb{F}{p^k}^*$,需在 $\mathbb{F}_{p^k}$ 上算 Miller loop——$k = 2^{255}$ 字段大小是天文数字。所以 secp256k1 实际上 pairing 存在但无法计算,因此不能用于 BLS/KZG/SNARK。
十三、明日预告
Day 185: 双线性配对 (Pairing) — 严谨定义双线性、对称/非对称配对、Tate / Weil / Optimal Ate 算法概要、Miller loop。理解 pairing 给出的"额外结构"(DDH 在 pairing 群里容易了,但 CDH 仍然难)。
核心问题:什么是 GT-strong 假设?为什么 SXDH 在 BLS12-381 上是合理假设?
参考文献:
- Barreto, Naehrig, "Pairing-friendly elliptic curves of prime order", 2005.
- Bowe, "BLS12-381: New zk-SNARK Elliptic Curve Construction", 2017.
- IETF draft "Pairing-friendly curves", https://datatracker.ietf.org/doc/draft-irtf-cfrg-pairing-friendly-curves/
- Kim, Barbulescu, "Extended Tower Number Field Sieve", CRYPTO 2016.