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: 签名者选择两个大素数 pq,计算 n=pq,计算 ed=1modϕ(n),其中 ϕ(n)=(p1)(q1)。公钥为 (e,n),私钥为 d
  2. Blind(m): 用户选择随机数 r,计算盲化消息 m=(mre)modn 并发送给签名者。
  3. Sign(d,m): 签名者使用私钥 d 对盲化消息 m 进行签名,生成盲签名 s=(m)dmodn 并返回给用户。
  4. Unblind(s,r): 用户使用随机数 r 对盲签名 s 进行去盲化,得到最终签名 s=(sr1)=mdmodn, s=mdred=mdrmodn
  5. Verify(e,n,m,s): 验证者计算 semodn==m

Schnorr盲签名

回顾:Schnorr签名

  1. Setup: 选择素数 p,q 使得 q(p1),取阶为 q 的生成元 g;设哈希 H:{0,1}Zq。私钥 xZq,公钥 y=gxmodp
  2. Sign(x,m): 签名者选随机数 kZq,计算 R=gkmodp,计算 e=H(Rm),计算 s=k+xemodq,签名为 σ=(e,s)
  3. Verify(y,m,σ): 验证者计算 R=gsyemodp,检查 H(Rm)?=e
  4. 也可以令 σ=(R,s),验证时计算 e=H(Rm),然后计算 R=gsyemodp,检查 R?=R

具体步骤

  1. Setup: 选择素数 p,q 使得 q(p1),取阶为 q 的生成元 g;设哈希 H:{0,1}Zq。私钥 xZq,公钥 y=gxmodp
  2. Commit: 签名者选随机数 kZq,计算 R=gkmodp,发送 R 给用户。
  3. Blind(m,R): 用户选盲化因子 α,βZq,计算 R=Rgαyβmodp,令 e=H(Rm),并令 e=e+βmodq,把 e 发给签名者。
  4. Sign(x,e): 签名者计算 s=k+xemodq,返回 s
  5. Unblind(s,α): 用户计算 s=s+αmodq,得到最终签名 σ=(e,s)
  6. Verify(y,m,σ): 验证者计算 R=gsyemodp,检查 H(Rm)?=e

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

R=gsye=gs+αy(eβ)=gk+xe+αgx(e+β)=gk+α+xβ=Rgαyβ=R