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),需验证签名是否合法。

  1. 重新计算挑战值:e = H(R || m) mod q (与签名生成时的计算完全一致)
  2. 验证核心等式(等式成立则签名合法):
    • 椭圆曲线群:(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 凭借双线性映射的魔力,在需要处理大量签名的场景(如区块链共识)中不可替代
posted @ 2025-07-29 16:16  ffffox  阅读(157)  评论(0)    收藏  举报