Skip to content

盲签名

概述

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

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

RSA盲签名

  1. SetupSetup: 签名者选择两个大素数 ppqq,计算 n=pqn = p \cdot q,计算 ed=1modϕ(n)ed = 1 \; mod \; \phi(n),其中 ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1)。公钥为 (e,n)(e, n),私钥为 dd
  2. Blind(m)Blind(m): 用户选择随机数 rr,计算盲化消息 m=(mre)modnm' = (m \cdot r^e) \; mod \; n 并发送给签名者。
  3. Sign(d,m)Sign(d, m'): 签名者使用私钥 dd 对盲化消息 mm' 进行签名,生成盲签名 s=(m)dmodns' = (m')^d \; mod \; n 并返回给用户。
  4. Unblind(s,r)Unblind(s', r): 用户使用随机数 rr 对盲签名 ss' 进行去盲化,得到最终签名 s=(sr1)=mdmodns = (s' \cdot r^{-1}) = m^d \; mod \; n, s=mdred=mdrmodn\because s' = m^d \cdot r^{ed} = m^d \cdot r \; mod \; n
  5. Verify(e,n,m,s)Verify(e, n, m, s): 验证者计算 semodn==ms^e \; mod \; n == m

Schnorr盲签名

回顾:Schnorr签名

  1. SetupSetup: 选择素数 p,qp, q 使得 q(p1)q \mid (p-1),取阶为 qq 的生成元 gg;设哈希 H:{0,1}ZqH:\{0,1\}^* \to \mathbb{Z}_q。私钥 xZqx \in \mathbb{Z}_q,公钥 y=gxmodpy = g^x \; mod \; p
  2. Sign(x,m)Sign(x, m): 签名者选随机数 kZqk \leftarrow \mathbb{Z}_q,计算 R=gkmodpR = g^{k} \; mod \; p,计算 e=H(Rm)e = H(R \,\|\, m),计算 s=k+xemodqs = k + x \cdot e \; mod \; q,签名为 σ=(e,s)\sigma = (e, s)
  3. Verify(y,m,σ)Verify(y, m, \sigma): 验证者计算 R=gsyemodpR' = g^{s} \cdot y^{-e} \; mod \; p,检查 H(Rm)?=eH(R' \,\|\, m) \;?=\; e
  4. 也可以令 σ=(R,s)\sigma = (R, s),验证时计算 e=H(Rm)e = H(R \,\|\, m),然后计算 R=gsyemodpR' = g^{s} \cdot y^{-e} \; mod \; p,检查 R?=RR' \;?=\; R

具体步骤

  1. SetupSetup: 选择素数 p,qp, q 使得 q(p1)q \mid (p-1),取阶为 qq 的生成元 gg;设哈希 H:{0,1}ZqH:\{0,1\}^* \to \mathbb{Z}_q。私钥 xZqx \in \mathbb{Z}_q,公钥 y=gxmodpy = g^x \; mod \; p
  2. CommitCommit: 签名者选随机数 kZqk \leftarrow \mathbb{Z}_q,计算 R=gkmodpR = g^{k} \; mod \; p,发送 RR 给用户。
  3. Blind(m,R)Blind(m, R): 用户选盲化因子 α,βZq\alpha,\beta \leftarrow \mathbb{Z}_q,计算 R=RgαyβmodpR' = R \cdot g^{\alpha} \cdot y^{\beta} \; mod \; p,令 e=H(Rm)e' = H(R' \,\|\, m),并令 e=e+βmodqe = e' + \beta \; mod \; q,把 ee 发给签名者。
  4. Sign(x,e)Sign(x, e): 签名者计算 s=k+xemodqs = k + x \cdot e \; mod \; q,返回 ss
  5. Unblind(s,α)Unblind(s, \alpha): 用户计算 s=s+αmodqs' = s + \alpha \; mod \; q,得到最终签名 σ=(e,s)\sigma = (e', s')
  6. Verify(y,m,σ)Verify(y, m, \sigma): 验证者计算 R=gsyemodpR'' = g^{s'} \cdot y^{-e'} \; mod \; p,检查 H(Rm)?=eH(R'' \,\|\, m) \;?=\; e'

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

R=gsye=gs+αy(eβ)=gk+xe+αgx(e+β)R'' = g^{s'} \cdot y^{-e'} = g^{s + \alpha} \cdot y^{-(e - \beta)} = g^{k + x \cdot e + \alpha} \cdot g^{x{(-e + \beta)}}

=gk+α+xβ=Rgαyβ=R=g^{k + \alpha + x \cdot \beta} = R \cdot g^{\alpha} \cdot y^{\beta} = R'