Skip to content

盲签名 ​

概述 ​

  1. Setup: 签名者生成公私钥对 (pk,sk)。
  2. Blind(m): 用户选择随机数 r,计算盲化消息 m′=Blind(m,r) 并发送给签名者。
  3. Sign(sk,m′): 签名者使用私钥 sk 对盲化消息 m′ 进行签名,生成盲签名 s′=Sign(sk,m′) 并返回给用户。
  4. Unblind(s′,r): 用户使用随机数 r 对盲签名 s′ 进行去盲化,得到最终签名 s=Unblind(s′,r)。
  5. Verify(pk,m,s): 验证者使用公钥 pk 验证消息 m 和签名 s 的有效性。

主要应用于隐私保护,例如我有一个投票消息,需要签名者对其进行签名以证明其有效性,但不希望签名者知道具体内容,也不希望签名者能够将签名与我关联起来,就可以通过盲签名来实现。

RSA盲签名 ​

  1. Setup: 签名者选择两个大素数 p 和 q,计算 n=p⋅q,计算 ed=1modϕ(n),其中 ϕ(n)=(p−1)(q−1)。公钥为 (e,n),私钥为 d。
  2. Blind(m): 用户选择随机数 r,计算盲化消息 m′=(m⋅re)modn 并发送给签名者。
  3. Sign(d,m′): 签名者使用私钥 d 对盲化消息 m′ 进行签名,生成盲签名 s′=(m′)dmodn 并返回给用户。
  4. Unblind(s′,r): 用户使用随机数 r 对盲签名 s′ 进行去盲化,得到最终签名 s=(s′⋅r−1)=mdmodn, ∵s′=md⋅red=md⋅rmodn
  5. Verify(e,n,m,s): 验证者计算 semodn==m。

Schnorr盲签名 ​

回顾:Schnorr签名 ​

  1. Setup: 选择素数 p,q 使得 q∣(p−1),取阶为 q 的生成元 g;设哈希 H:{0,1}∗→Zq。私钥 x∈Zq,公钥 y=gxmodp。
  2. Sign(x,m): 签名者选随机数 k←Zq,计算 r=gkmodp,计算 c=H(R‖m),计算 s=r+cxmodq,签名为 σ=(c,s)。
  3. Verify(y,m,σ): 验证者计算 R′=gs⋅y−cmodp,检查 H(R′‖m)?=c。
  4. 也可以令 σ=(r,s),验证时计算 c=H(R‖m),然后计算 r′=gs⋅y−cmodp,检查 R′?=R。

具体步骤 ​

原始版 ​

  • alt text
  • alt text

优化版 ​

  1. Setup: 选择素数 p,q 使得 q∣(p−1),取阶为 q 的生成元 g;设哈希 H:{0,1}∗→Zq。私钥 x∈Zq,公钥 y=gxmodp。
  2. Commit: 签名者选随机数 r←Zq,计算 R=grmodp,发送 R 给用户。
  3. Blind(m,R): 用户选盲化因子 α,β←Zq,计算 R′=R⋅gα⋅yβmodp,令 c′=H(R′‖m),并令 c=c′+βmodq,把 c 发给签名者。
  4. Sign(x,c): 签名者计算 s=r+cxmodq,返回 s。
  5. Unblind(s,α): 用户计算 s′=s+αmodq,得到最终签名 σ=(c′,s′)。
  6. Verify(y,m,σ): 验证者计算 R″=gs′⋅y−c′modp,检查 H(R″‖m)?=c′。

正确性:本质上是确认 R″=R′:

R″=gs′⋅y−c′=gs+α⋅y−(c−β)=gr+x⋅c+α⋅gx(−c+β)=gr+α+x⋅β=R⋅gα⋅yβ=R′

BLS 盲签名 ​

KeyGen ​

  1. Sample sk←Zp∗
  2. Calc pk=g⋅G2

Blind ​

  1. H=HashToG1(message)∈G1
  2. Sample r←Zp∗
  3. Blind the message: H′=H⋅r

Sign ​

  1. Sign the blinded message: σ′=H′⋅sk

Unblind ​

  1. Unblind the signature: σ=σ′⋅r−1
  2. Obvoiusly obtain the signature on the original message: σ=H⋅sk

Verify ​

  1. Calc e(σ,G2)==e(HashToG1(message),pk)==e(H,G2)sk