BLS 与 Schnorr 签名算法:从数学原理到实际应用
BLS 与 Schn Schnorr 签名算法:从数学原理到流程可视化解析
数字签名是区块链安全的核心基石,Schnorr 和 BLS 签名算法凭借其独特优势,已成为区块链领域的主流选择。本文将通过精准的数学公式和流程图示,深入解析两种算法的工作机制,既保持密码学的专业性,又通过可视化方式降低理解门槛。
一、密码学基础:椭圆曲线与群论
两种算法均基于椭圆曲线密码学(ECC),需先理解两个核心概念:
- 椭圆曲线点运算:在椭圆曲线上,点的"加法"和"乘法"遵循特殊规则,具有封闭性(运算结果仍在曲线上)
- 生成元:曲线上的基准点 $G$,所有其他点可通过 $G$ 与整数相乘得到($k \cdot G$ 表示 $G$ 自身相加 $k$ 次)
二、Schnorr 签名算法:简洁高效的设计
1. 核心参数定义
- 椭圆曲线 E,生成元 G,阶为 n
- 私钥:随机整数 k(1≤k≤n-1,需保密)
- 公钥:P = k·G(椭圆曲线点,可公开)
2. 签名生成流程(图示)
┌─────────────┐ 随机选择 ┌─────────────┐
│ 消息 m │ ──────────────→ │ 临时私钥 r │
└─────────────┘ └──────┬──────┘
│
┌─────────────┐ ▼
│ 私钥 k │ ←───────────── ┌─────────────┐
└──────┬──────┘ │ 临时公钥 R │
│ │ = r·G │
│ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ 哈希计算 ┌─────────────┐
│ 挑战值 e │ ←─────────────→ │ 拼接 R||P||m │
│=Hash(R||P||m)│ └─────────────┘
└──────┬──────┘
│
▼
┌─────────────┐
│ 签名 s │
│=r + e·k mod n│
└──────┬──────┘
│
▼
┌─────────────┐
│ 最终签名 │
│ (R, s) │
└─────────────┘
数学公式拆解:
- 临时公钥 R = r * G(将临时私钥映射到曲线上)
- 挑战值 e = {Hash}(R || P || m)(绑定消息、公钥和临时参数)
- 签名值 s = (r + e * k) mod n(融合临时参数与私钥)
3. 签名验证流程(图示)
┌─────────────┐ 接收 ┌─────────────┐
│ 消息 m │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
┌──────▼──────┐ 接收 ┌─────────────┐
│ 公钥 P │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
┌──────▼──────┐ 接收 ┌─────────────┐
│ 签名 (R,s) │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
├─────────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 计算 e=Hash( │ │ 计算左边: │
│ R||P||m) │ │ s·G │
└──────┬──────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 计算右边: │ │ 验证等式: │
│ R + e·P │ │ 左边 == 右边 │
└──────┬──────┘ └──────┬──────┘
│ │
└───────────────┘
│
┌──────▼──────┐
│ 签名有效/无效 │
└─────────────┘
验证者已知用户公钥 pk、消息 m 和签名 (s, R),需验证签名是否合法。
- 重新计算挑战值:e = H(R || m) mod q (与签名生成时的计算完全一致)
- 验证核心等式(等式成立则签名合法):
- 椭圆曲线群:(s · g) + (e · pk) = R (“·”是点乘,“+”是椭圆曲线点加)
- 有限域群:(g^s · pk^e) mod p = R (“^”是幂乘,“·”是有限域乘法,结果模 p)
3. 关键推导
验证等式的推导逻辑:
从签名生成的 s = (k - e·sk) mod q,可变形为 k = (s + e·sk) mod q;
两边同时与生成元 g 运算(点乘或幂乘):
- 椭圆曲线群:k·g = (s + e·sk)·g = s·g + e·(sk·g) = s·g + e·pk;
- 而 k·g 就是临时公钥 R,因此得到验证等式:s·g + e·pk = R。
4. 聚合签名特性
Schnorr 支持同消息多签名聚合:
多用户对同一消息签名时,可聚合成单个签名:
- 各用户签名:(R₁,s₁)、(R₂,s₂)、...、(Rₙ,sₙ)
- 聚合签名:R = R₁+R₂+...+Rₙ,s = s₁+s₂+...+sₙ
- 验证:使用聚合公钥 P = P₁+P₂+...+Pₙ,按上述流程验证
┌─────────┐ ┌─────────┐ ┌─────────┐
│用户1签名│ │用户2签名│ ... │用户n签名│
│(R1,s1) │ │(R2,s2) │ │(Rn,sn) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
▼ ▼ ▼
┌───────────────────────────────────────┐
│ 聚合签名 (R=ΣRi, s=Σsi) │
└───────────────────────────────────────┘
三、BLS 签名算法:聚合能力的突破
1. 核心参数定义
- 双线性映射系统(G₁, G₂, Gₜ, e, p, G)
- G₁、G₂:加法循环群(阶为 p)
- Gₜ:乘法循环群(阶为 p)
- e:双线性映射函数 e: G₁×G₂→Gₜ
- 私钥:随机整数 sk(1≤sk≤p-1,需保密)
- 公钥:pk = sk·G(G 为 G₁ 生成元,可公开)
- 哈希函数:H(m) → G₂(将消息映射到 G₂ 群)
2. 双线性映射的关键特性
BLS 签名的强大源于映射的三个特性:
- 双线性:e(aP, bQ) = e(P, Q)^(a·b)
- 非退化性:存在 P、Q 使 e(P, Q) ≠ 1
- 可计算性:存在高效算法计算 e(P, Q)
G1 × G2 e() GT
▲ ▼ ▲
│ (乘法群) │
│ │
│ (aP, bQ) → e(P,Q)^(ab) │
│ │
└─────────────────────────────┘
3. 签名生成流程(图示)
┌─────────────┐ 哈希映射 ┌─────────────┐
│ 消息 m │ ─────────────→ │ 哈希点 h │
└─────────────┘ │ = H(m)∈G2 │
└──────┬──────┘
│
┌─────────────┐ ▼
│ 私钥 sk │ ─────────────→ ┌─────────────┐
└─────────────┘ │ 签名 σ │
│ = sk·h∈G2 │
└─────────────┘
4. 签名验证流程(图示)
┌─────────────┐ 接收 ┌─────────────┐
│ 消息 m │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ 计算 h=H(m) │
└──────┬──────┘
│
┌──────▼──────┐ 接收 ┌─────────────┐
│ 公钥 pk │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
┌──────▼──────┐ 接收 ┌─────────────┐
│ 签名 σ │ ←─────────── │ 发送方 │
└──────┬──────┘ └─────────────┘
│
├─────────┐
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 计算 e(pk,h)│ │ 计算 e(G,σ) │
└──────┬──────┘ └──────┬──────┘
│ │
▼ ▼
┌─────────────────────────────┐
│ 验证 e(pk,h) == e(G,σ) │
└───────────────┬─────────────┘
│
┌────────▼────────┐
│ 签名有效/无效 │
└─────────────────┘
验证原理:利用双线性映射的特性
根据双线性映射特性:
e(pk, h) = e(sk·G, h) = e(G, h)^sk
e(G, σ) = e(G, sk·h) = e(G, h)^sk
因此 e(pk, h) = e(G, σ) 是签名有效的充要条件。
5. 跨消息聚合签名(BLS 核心优势)
支持不同用户对不同消息的签名聚合:
- 各用户签名:σ₁=sk₁·H(m₁)、σ₂=sk₂·H(m₂)、...、σₙ=skₙ·H(mₙ)
- 聚合签名:σ_agg = σ₁+σ₂+...+σₙ
- 验证:e(pk₁+pk₂+...+pkₙ, H(m_i)) = e(G, σ_agg)
┌──────┐ m1 ┌──────┐ ┌──────┐ mn ┌──────┐
│用户1 │────→ │σ1=sk1│ │用户n │────→ │σn=skn│
└──────┘ │·H(m1)│ └──────┘ │·H(mn)│
└───┬──┘ └───┬──┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────┐
│ 聚合签名 σagg = σ1 + σ2 + ... + σn │
└─────────────────────────────────────────────────────┘
四、算法对比与应用场景
| 特性 | Schnorr 签名 | BLS 签名 |
|---|---|---|
| 数学基础 | 椭圆曲线离散对数问题 | 双线性映射 |
| 签名尺寸 | 64字节(R + s) | 32/64字节(单个群元素) |
| 验证复杂度 | 低(椭圆曲线点运算) | 中(双线性映射计算) |
| 聚合能力 | 仅支持同消息多签名 | 支持跨消息、跨用户聚合 |
| 典型应用 | 比特币 Taproot、闪电网络 | 以太坊 2.0 共识、分布式存储验证 |
| 核心优势 | 验证速度快,实现简单 | 聚合效率极高,适合大规模签名场景 |
五、总结
Schnorr 和 BLS 签名算法是密码学的两大突破,各自在不同场景中发挥优势:
- Schnorr 以简洁高效取胜,适合单笔交易和同消息多签,如支付场景
- BLS 凭借双线性映射的魔力,在需要处理大量签名的场景(如区块链共识)中不可替代
本文来自博客园,作者:ffffox,转载请注明原文链接:https://www.cnblogs.com/ffffox/p/19010994

浙公网安备 33010602011771号