Skip to content

Theshold BBS+

Threshold BBS+ Signatures for Distributed Anonymous Credential Issuance

BBS+ 基本流程

1. KeyGen

  • 假设待签名消息数量为
  • 选择生成元 G1G1G2G2
  • 随机选择 +1 个元素,记为
H=(H1,H2,,H+1),HiG1
  • 随机选择私钥 x$Zp
  • 计算公钥元素
X=xG2G2
  • 输出:
    • 公钥 pk=(G1,G2,H,X)
    • 私钥 sk=x

2. Sign

给定消息向量:

m=(m1,m2,,m),miZp

签名者执行:

  • 采样随机数 e,s$Zp
  • 构造承诺基点:
C=G1+sH1+i=1miHi+1
  • 计算
A=(x+e)1C
  • 输出签名:
σ=(A,e,s)

3. Verify

给定消息向量 m 和签名 σ=(A,e,s),验证者检查:

e(A,X+eG2)=?e(G1+sH1+i=1miHi+1,G2)

若等式成立,则接受该签名。

4. 正确性

因为

A=(x+e)1(G1+sH1+i=1miHi+1)

所以:

e(A,X+eG2)=e((x+e)1(G1+sH1+i=1miHi+1),(x+e)G2)=e(G1+sH1+i=1miHi+1,G2)

因此验证方程成立。

Blind BBS+

普通 BBS+ 中,签名者直接看到全部消息。盲签名场景下,用户希望:

  • 某些消息对签名者可见;
  • 某些消息对签名者隐藏;
  • 签名者最终仍然对完整消息向量签名。

这时需要补充 blindblind signunblind 三步。

1. 消息划分

设消息集合被拆成两部分:

  • 显式消息(签名者可见):{mi}iR
  • 隐藏消息(签名者不可见):{mj}jH

其中 RH={1,2,,},且 RH=

2. Blind

用户先对隐藏消息做一个承诺,并发送给签名者。

  • 用户随机选择盲化因子 r$Zp
  • 计算隐藏消息承诺:
Cblind=rH1+jHmjHj+1
  • 用户将 Cblind 发送给签名者

在更严格的协议中,用户还需要附带一个零知识证明,证明自己确实知道 (r,{mj}jH),否则签名者可能会在无效承诺上签名。

3. Proof of Knowledge of Commitment(PoK)

为了让签名者相信用户不是随意伪造一个群元素,而是真的知道隐藏消息与盲化因子,用户需要对 Cblind 附带一个知识证明。

设隐藏消息个数为 |H|,用户要证明自己知道:

  • 盲化因子 r
  • 隐藏消息 {mj}jH
  • 且它们满足
Cblind=rH1+jHmjHj+1

这可以用一个基于 Fiat--Shamir 变换的 Sigma 协议来实现。

Prove

用户执行:

  • 随机选择掩码
r~$Zp,m~j$Zp(jH)
  • 构造临时承诺
T=r~H1+jHm~jHj+1
  • 计算挑战
c=Hash(Cblind,T,|H|)
  • 计算响应值
s^=r~+crm^j=m~j+cmj(jH)
  • 输出证明
πpok=(T,c,s^,{m^j}jH)

Verify

签名者收到 (Cblind,πpok) 后,执行:

  • 重新计算挑战
c=Hash(Cblind,T,|H|)
  • 检查 c=c

  • 检查如下等式是否成立:

s^H1+jHm^jHj+1=?T+cCblind

若成立,则说明用户确实知道对应的盲化因子和隐藏消息;否则拒绝继续 blind signing。

为什么验证等式成立

因为

s^H1+jHm^jHj+1=(r~+cr)H1+jH(m~j+cmj)Hj+1=r~H1+jHm~jHj+1+c(rH1+jHmjHj+1)=T+cCblind

因此只要用户知道 (r,{mj}),它就能构造出可验证的响应;而不知道这些值的一方通常无法通过该检查。

4. BlindSign

签名者拿到:

  • 可见消息 {mi}iR
  • 用户提交的承诺 Cblind
  • 用户提交的知识证明 πpok

签名者先验证 πpok,仅在验证通过后继续签名。

然后:

  • 采样随机数 e,s$Zp
  • 构造待签名项
C=G1+Cblind+sH1+iRmiHi+1
  • 计算盲签名
A=(x+e)1C
  • 输出给用户:
σ=(A,e,s)

5. Unblind

用户收到盲签名 σ=(A,e,s) 后,利用自己掌握的盲化因子 r 计算最终签名。

注意到:

C=G1+Cblind+sH1+iRmiHi+1=G1+(rH1+jHmjHj+1)+sH1+iRmiHi+1=G1+(s+r)H1+k=1mkHk+1

因此用户令:

s=s+r

并得到标准 BBS+ 签名:

σ=(A,e,s)

这个签名可直接按普通 Verify 算法验证。

6. 为什么解盲成立

由上式可知:

A=(x+e)1(G1+sH1+k=1mkHk+1)

其中 s=s+r。所以解盲后的 σ=(A,e,s) 与普通 BBS+ 输出格式完全一致。

门限设置下的 BBS+

在门限场景中,可将私钥 x 通过秘密分享拆成 n 份,使得任意 t 份可恢复或协同计算。此时:

  • 各参与方分别持有 x 的份额;
  • 在签名阶段通过 MPC 协同计算 (x+e)1
  • 最终得到与普通 BBS+ 一致的签名结果。

如果系统还要支持 blind signing,那么 MPC 参与方实际上是在对用户提交的承诺 Cblind 与可见消息共同构成的目标项执行门限签名。

选择性披露(Selective Disclosure)

BBS+ 的核心优势之一,是签名生成后用户可以只披露部分消息,而不暴露全部消息内容。

1. 将 BBS+ 看作对承诺的签名

定义:

C=G1+sH1+i=1miHi+1=(x+e)A

因此,签名实际上证明了签名者认可这组消息被编码进了承诺 C 中。

2. 选择性披露的目标

用户持有 (A,e,s,m),希望向验证者证明:

  • 自己知道一个有效 BBS+ 签名;
  • 某些消息 mi 被公开;
  • 其余消息仍被隐藏,但签名依然对完整消息集有效。

设公开集合为 R,隐藏集合为 H,则目标关系可写成:

e(A,X+eG2)=e(G1+sH1+iRmiHi+1+jHmjHj+1,G2)

验证者直接看到的是公开消息,而对隐藏消息部分,需要用户给出零知识证明,说明“存在某些未公开消息使得上式成立”。

3. 可用的证明工具

  • 可以使用多底数离散对数知识证明;
  • 实现上通常可借助一个或多个 Sigma 协议;
  • 若还要证明隐藏属性满足区间、年龄门槛等条件,则可叠加范围证明,如 Bulletproofs

4. 不可链接性

选择性披露协议通常会对签名进行随机化处理。由于每次证明都会重新采样随机数,验证者即使多次看到同一份凭证导出的证明,也无法轻易判断它们是否来自同一用户,因此具备较好的不可链接性。