密码学系列 - ECDSA的门限签名方案

++门限签名允许在不需要集中私钥的情况下,由多个参与者生成签名,并且只有在达到一定数量的签名(即达到阈值)时,签名才被视为有效。++

要理解为什么 ECDSA 支持签名合成的原理,我们需要深入探讨椭圆曲线密码学(ECC)和门限签名的基本工作机制。特别是需要了解如何通过椭圆曲线实现分布式密钥生成和签名合成。尽管 ECDSA 本身并不直接支持门限签名,但是通过特定的密码学协议和分布式计算方法,可以实现这一目标。以下是相关原理的详细解释。

椭圆曲线密码学(ECC)的基础

椭圆曲线密码学基于椭圆曲线上的点运算。设定一个椭圆曲线 E E E 和一个素数 p p p,椭圆曲线上的点满足以下方程:

y 2 = x 3 + a x + b m o d    p y^2 = x^3 + ax + b \mod p y2=x3+ax+bmodp

其中 a a a 和 b b b 是曲线参数。ECC 的安全性基于椭圆曲线离散对数问题(ECDLP)的难度,即给定点 P P P 和点 Q Q Q,找出 k k k 使得 Q = k P Q = kP Q=kP 是困难的。

ECDSA 签名算法

ECDSA 签名由以下步骤组成:

  1. 密钥生成 :生成私钥 d d d 和相应的公钥 Q = d G Q = dG Q=dG,其中 G G G 是基点。
  2. 签名生成
    1. 选择一个随机数 k k k。
    2. 计算 R = k G R = kG R=kG,取 R R R 的 x x x 坐标 r r r。
    3. 计算 s = k − 1 ( H ( m ) + r d ) m o d    n s = k^{-1}(H(m) + rd) \mod n s=k−1(H(m)+rd)modn,其中 H ( m ) H(m) H(m) 是消息 m m m 的哈希值。
    4. 签名对为 ( r , s ) (r, s) (r,s)。
  3. 签名验证
    1. 计算 u 1 = s − 1 H ( m ) m o d    n u_1 = s^{-1}H(m) \mod n u1=s−1H(m)modn 和 u 2 = s − 1 r m o d    n u_2 = s^{-1}r \mod n u2=s−1rmodn。
    2. 计算 R ′ = u 1 G + u 2 Q R' = u_1G + u_2Q R′=u1G+u2Q,取 R ′ R' R′ 的 x x x 坐标 r ′ r' r′。
    3. 若 r ′ = r r' = r r′=r,则签名有效。

⭐门限签名的原理

门限签名的目的是通过多个参与者共同生成一个签名,保证即使部分参与者被破坏,系统仍然安全。实现这一点需要以下步骤:

  1. 分布式密钥生成
    • 使用分布式密钥生成协议(例如 Shamir's Secret Sharing)来分割私钥,使得任意 t t t 个参与者可以重构密钥。
  2. 部分签名生成
    • 每个参与者使用自己的私钥份额生成部分签名。
  3. 签名合成
    • 将部分签名合成为完整签名。

具体实现

1. 分布式密钥生成

使用 Shamir's Secret Sharing 将私钥分割成多个份额。假设私钥为 d d d,有 n 个参与者,t 是阈值。生成 t-1 次的随机多项式 f ( x ) = d + a 1 x + a 2 x 2 + ⋯ + a t − 1 x t − 1 f(x) = d + a_1x + a_2x^2 + \cdots + a_{t-1}x^{t-1} f(x)=d+a1x+a2x2+⋯+at−1xt−1,然后计算每个参与者的密钥份额 d i = f ( i ) d_i = f(i) di=f(i)。

  • 使得 f(0) = d。然后计算 f(1), f(2), ..., f(n) 作为份额分发给 n 个参与者。
2. 部分签名生成

每个参与者使用自己的密钥份额 d i d_i di 计算部分签名。具体地,选择随机数 k i k_i ki,计算 R i = k i G R_i = k_iG Ri=kiG 和部分签名 s i = k i − 1 ( H ( m ) + r i d i ) m o d    n s_i = k_i^{-1}(H(m) + r_id_i) \mod n si=ki−1(H(m)+ridi)modn。

3. 签名合成

通过零知识证明,验证每个部分签名的有效性,然后合成部分签名。由于 R = ∑ R i R = \sum R_i R=∑Ri,可以合成出 R R R 的 x x x 坐标 r r r。合成 s s s 的方法如下:

s = ∑ s i m o d    n s = \sum s_i \mod n s=∑simodn

这样,完整签名为 ( r , s ) (r, s) (r,s),满足 ECDSA 验证条件。

示例代码

以下示例展示如何通过 Python 实现一个简化的 ECDSA 门限签名:

python 复制代码
from ecdsa import SigningKey, SECP256k1
from hashlib import sha256
import random

def generate_key_shares(n, t, secret):
    # Shamir's Secret Sharing scheme
    coeffs = [secret] + [random.randint(1, SECP256k1.order) for _ in range(t - 1)]
    shares = [(i, sum([coeffs[j] * (i ** j) for j in range(t)]) % SECP256k1.order) for i in range(1, n + 1)]
    return shares

def partial_sign(message, share):
    # Each participant generates a partial signature
    sk = SigningKey.from_secret_exponent(share[1], curve=SECP256k1)
    return sk.sign(message)

def combine_signatures(partial_signatures):
    # Simplified combination of partial signatures (in reality, requires more sophisticated handling)
    return partial_signatures[0]

# Example usage
message = b'This is a test message'
hash_message = sha256(message).digest()

# Generate master key
master_sk = SigningKey.generate(curve=SECP256k1)
master_secret = master_sk.privkey.secret_multiplier

# Generate shares
n, t = 5, 3
shares = generate_key_shares(n, t, master_secret)

# Generate partial signatures
partial_signatures = [partial_sign(hash_message, share) for share in shares[:t]]

# Combine signatures
signature = combine_signatures(partial_signatures)

# Verify signature
vk = master_sk.verifying_key
assert vk.verify(signature, hash_message)
print("Signature is valid.")

相关的库

GG18(Gennaro-Goldfeder 2018)和 CMP20(Canetti-Mukherjee-Perrin 2020)都是 门限签名(Threshold Signature) 协议,主要用于 分布式密钥生成(DKG)分布式签名(TSS),但它们在安全性、计算复杂度、通信开销等方面有所不同。以下是两者的关键对比:

属性 GG18 (Gennaro-Goldfeder 2018) CMP20 (Canetti-Mukherjee-Perrin 2020)
安全模型 适用于静态恶意模型 适用于更强的自适应恶意模型
门限 DKG 需要固定参与者,支持 ( t , n ) (t,n) (t,n)-门限 更灵活,可动态调整参与者
零知识证明 使用 Schnorr 证明 使用 Bulletproofs 以提高效率
计算复杂度 需要较多计算,特别是 NIZK 证明 计算开销优化,支持批量签名
通信开销 主要依赖广播,通信量较大 采用更优化的交互协议,通信量减少
抗攻击性 抗静态恶意敌手(Static Adversary) 抗自适应恶意敌手(Adaptive Adversary),更安全
分布式签名 交互式签名协议,签名时需要通信 非交互式签名支持(Lagrange 形式),更高效
应用场景 适用于 多方计算(MPC)、门限签名 适用于 去中心化钱包、高安全性 TSS

总结

  • GG18 适用于 静态恶意模型 ,并且由于其较大的计算和通信成本,主要用于 MPC 相关应用
  • CMP20 进一步优化了计算和通信,同时增强了安全性,使其更适合 区块链、去中心化钱包等场景,尤其是在更强的安全需求下。

如果你的应用场景需要 更高的安全性、灵活性和计算优化 ,CMP20 更适合。GG18 仍然是一个成熟的协议,适用于特定门限签名场景。

结论

ECDSA 支持部分签名和签名合成的原理基于分布式密钥生成和零知识证明等密码学技术。尽管 ECDSA 本身不直接支持门限签名,但通过使用这些技术,可以实现门限签名,从而在保持高安全性的同时提高系统的可靠性和容错能力。


: 区块链知识系列
: 密码学系列
: 零知识证明系列
: 共识系列
: 公链调研系列
: BTC系列
: 以太坊系列
: EOS系列
: Filecoin系列
: 联盟链系列
: Fabric系列
: 智能合约系列
: Token系列

相关推荐
如君愿3 天前
考研复习 Day 52 | 密码学--第九章 密钥管理(下)
密码学·课后习题
下午写HelloWorld6 天前
可信执行环境(Trusted Execution Environment, TEE)技术解析与应用2026
密码学·数据安全·可信计算技术·tee·隐私保护·可信执行环境
终端域名6 天前
密码学哈希函数:区块链 “不可篡改” 的核心数字指纹技术
区块链·密码学·哈希算法
国际学术会议-杨老师6 天前
2026年量子算法、密码学与数据分析国际会议(QACDA 2026)
数据分析·密码学·量子计算
如君愿8 天前
考研复习 Day 51 | 密码学--第九章 密钥管理(上)
密码学
黄金龙PLUS8 天前
基于ARX结构的新型序列密码算法FlashLight
算法·网络安全·密码学·哈希算法·同态加密
下午写HelloWorld9 天前
【概念与应用】轻量级加密算法LEA、动态脱敏算法DDA、零知识证明ZKP和优化协同交互协议OCIP
算法·区块链·密码学·安全架构·零知识证明
如君愿9 天前
考研复习 Day 50 | 密码学--第八章 数字签名与身份认证(下)
密码学·课后习题
下午写HelloWorld9 天前
后量子密码算法:协同签名研究综述
算法·密码学·后量子·协同签名
夏语灬10 天前
cryptography:Python 密码学标准库的终极选择
开发语言·python·密码学