返回 Expert 笔记
Expert Day 184

主流椭圆曲线对比 — secp256k1 / Curve25519 / BN254 / BLS12-381

4 条曲线参数/形式/嵌入度/安全级别/pairing-friendly 性,对比 BN254 vs BLS12-381 vs BLS12-377

2026-11-01
Phase 4 - 密码学数学基础 (Day 181-194)
密码学椭圆曲线pairingBLS12-381secp256k1

日期: 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$
MNTvaries4, 6MNT4-298, MNT6-298
BN$\rho \approx 1$12BN254, BN382
BLS$\rho \approx 1.5$12, 24, 48BLS12-381, BLS24-315
KSS$\rho \approx 1.6-1.9$18KSS18
BW$\rho \approx 1.5$6BW6-761 (递归 of BLS12-377)

$\rho = 1$ 是理想(field size = 子群 size),BN 是 $\rho \approx 1$。BLS 略大但更安全。


六、决策表

6.1 应用 → 曲线推荐

场景推荐原因
比特币/EVM 签名secp256k1历史兼容,128-bit 安全
现代 TLS/SSHEd25519简单实现安全,性能好
BLS 聚合签名 (Eth2)BLS12-381128-bit pairing-friendly
通用 SNARK (Groth16/Plonk)BLS12-381工具链成熟
递归 SNARKBLS12-377 ↔ BW6-761嵌套结构
FRI/STARK (无 pairing)Goldilocks $\mathbb{F}_p, p=2^{64}-2^{32}+1$64-bit field 高速
旧合约 ZKBN254 (alt_bn128)EIP-196/197 兼容

6.2 性能对比 (粗略,128-bit security)

操作secp256k1Ed25519BN254BLS12-381
标量乘 (us)~30~50~80~200
Pairing (ms)N/AN/A~3~5-10
公钥大小 (压缩)33 bytes32 bytes32 bytes ($\mathbb{G}_1$) / 64 ($\mathbb{G}_2$)48 bytes ($\mathbb{G}_1$) / 96 ($\mathbb{G}_2$)
签名大小64 bytes64 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

十、常见陷阱

  1. BN254 误以为 128-bit 安全:旧文档/EIP 写 128 bit,实际后 NFS 改进只剩 ~100 bit。新协议应迁 BLS12-381。
  2. Curve25519 余因子 8 忘 clamp:导致 small subgroup attack。X25519 协议规范已 baked-in clamp。
  3. 混淆 BLS 算法 vs BLS 曲线:BLS 签名是 Boneh-Lynn-Shacham;BLS 曲线是 Barreto-Lynn-Scott。两个不同三人组!很多人混淆。
  4. 公钥放在 $\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)。
  5. 嵌入度 1:supersingular 曲线 $k=2$ 极小,pairing 极快,但安全极弱(MOV 攻击直接打)。所以"pairing-friendly"必须 $k \ge 6$ 或更大。
  6. 二进制/三元曲线:$\mathbb{F}_{2^n}$ 上曲线(曾用于嵌入式)后来发现弱(Diem 攻击),现已弃。

十一、关键速查

安全级别对照

Sec bitsRSADH ($\mathbb{F}_p$)ECC对称Hash
12830723072256AES-128SHA-256
19276807680384AES-192SHA-384
2561536015360512AES-256SHA-512

嵌入度选型

  • $k = 1, 2$:太弱(MOV)
  • $k = 6, 8$:可用但不流行
  • $k = 12$:sweet spot,多数 ZK 用
  • $k = 24, 48$:高安全,BLS24/48 实验性

十二、面试题

Q1: 为什么 Ethereum 从 BN254 迁移到 BLS12-381?

  1. 安全性:Tower NFS 攻击让 BN254 的 $\mathbb{F}_{p^{12}}$ DLP 安全降到 ~100 bit。BLS12-381 的 $p$ 字段 381 bit,安全保持 128 bit。
  2. 聚合签名需求:Eth2 共识用 BLS 签名聚合,每 slot 数千签名聚成一个。BLS 协议天然在 BLS12-381 上设计。
  3. EIP-2537 引入 BLS12-381 precompile(预编译合约),让 EVM 高效验证 BLS 签名 + KZG 证明(EIP-4844 Blob 用)。
  4. 生态共识: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 上是合理假设?

参考文献: