密码学系列 - 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系列

相关推荐
MicroTech20255 天前
基于后量子密码学:微算法科技(NASDAQ: MLGO)区块链预言机加密可更新方案
科技·区块链·密码学
道法自然|~5 天前
BugCTF黄道十二宫
算法·密码学
温中志6 天前
计算机密码学基础
密码学
Jianghong Jian12 天前
Hashcat:强大的密码恢复与安全测试工具
测试工具·安全·密码学
WHD30613 天前
企业数据安全体系建设指南:从风险识别到技术落地的全流程(2026版)
大数据·网络·人工智能·安全·系统架构·密码学·安全架构
Y5neKO13 天前
某国赛CTF密码学题目Writeup:RSA
密码学·ctf·rsa
老星*15 天前
Vaultwarden:开源轻量的1Password替代,自托管密码管理方案
开源·github·密码学
山川绿水15 天前
bugku——MISC——键盘
安全·网络安全·系统安全·密码学
Sunsets_Red17 天前
乘法逆元的 exgcd 求法
c++·学习·数学·算法·c#·密码学·信息学竞赛
code_li17 天前
为什么手机没网,身份验证器也能生成验证码
智能手机·密码学