Skip to content

BBS 签名

Revisiting BBS Signatures

BBS 基本流程

1. 系统参数生成(BBS.Setup)

假设我们有 l 条消息:

G1$G1H1,,Hl$G1G2$G2par(G1,G2,GT,e,G1,H1,G2)

输出公共参数 par。这里的 H 可以是任意点。

2. 密钥生成(BBS.KG)

输入 par,执行:

x$Zp,XxG2
  • 秘密密钥:sk=x
  • 公钥:pk=X

返回 (sk,vk)

3. 签名生成(BBS.Sign)

输入 sk=x 和消息向量 m=(m1,,ml)Zp,执行:

  1. 计算消息承诺:CG1+i=1lmiHiG1
  2. 随机选择标量 ee$Zp
  3. 计算签名:A1x+eCG1

输出签名 σ=(A,e)
签名长度:1 个 G1 点 + 1 个 Zp 标量(比 BBS+ 少一个标量 s)。

4. 签名验证(BBS.Ver)

输入公钥 X、消息 m、签名 (A,e),执行:

  1. 重新计算承诺:CG1+i=1miHi
  2. 检查配对等式:e(A, X+eG2)=?e(C,G2)

若等式成立(且 AO),则验证通过;否则拒绝。

5. 正确性

诚实生成的签名满足 (x+e)A=C
对两边同时与 G2 配对:

e((x+e)A, G2)=e(C, G2)

由双线性得到:

e(A, (x+e)G2)=e(C, G2)e(A, X+eG2)=e(C, G2)

验证等式恒成立。

零知识披露

BBS 的 零知识 Σ-协议(Sigma-Protocol
(用于证明知道有效 BBS 消息-签名对,同时隐藏签名 (A, e) 和部分消息分量

公共输入(Verifier 已知):

  • BBS 参数:G1,Hi[1..],G2,X
  • J= 已知分量下标,I= 隐藏分量下标(IJ=[]
  • 部分披露的消息向量 miJ

私密输入(Prover 知道):

  • 完整消息 m
  • 有效签名 (A,e)AO

目标:Prover 向 Verifier 证明存在 (m,A,e) 使得 BBS.Ver 接受,同时隐藏 A,e 以及 m 中标有 的分量。

1. 完整披露, 所有消息已知

Prover(P1)

  1. 随机 r$Zp

  2. 计算随机化签名点:

    ArA
  3. 计算辅助点:

    CG1+i=1miHiBrCreA
  4. 随机 α,β$Zp

  5. 计算同态承诺:

    UαC+βA

发送 (A,B,U) 给 Verifier。

Verifier 发送挑战

c$Zp

Prover(P2)响应

sα+rc,tβec

发送 (s,t)

Verifier 检查(PoK.V):

  1. 配对检查(确认随机化签名合法):e(A, X)=?e(B, G2)
  2. 同态检查(证明 B 的表示):U+cB=?sC+tA
正确性
  1. 配对检查:

    lhs==e(rA,X)=e(A,rxG2)rhs==e(rCreA,G2)=e(CeCx+e,rG2)=e(xCx+e,rG2)=e(Cx+e,xrG2)=e(A,rxG2)=lhs
  2. 同态检查:

lhs=U+cB=αC+βA+c(rCreA)=(α+rc)C+(βre)A=sC+tA=rhs

2. 部分披露(Partial Disclosure,隐藏部分消息)

Prover(P1)

  1. 随机 r$Zp
  2. 计算 ArA
  3. 计算公开部分承诺(Verifier 也能算):CJG1+jJmjHj
  4. 计算隐藏部分的辅助点:BrCreA
  5. 随机 α,β$Zp,并对每个隐藏分量 iI 随机 δi$Zp
  6. 计算同态承诺(现在包含隐藏分量):UαCJ+βA+iIδiHi

发送 (A,B,U) 给 Verifier。

Verifier 发送挑战 c$Zp

Prover(P2)响应

sα+rc,tβec

对每个隐藏分量:

uiδi+rmic(iI)

发送 (s,t,{ui}iI)

Verifier 检查(PoK.V):

  1. 配对检查(同上):e(A, X)=?e(B, G2)
  2. 同态检查(现在使用公开部分 + 隐藏响应):U+cB=?sCJ+tA+iIuiHi

FS 变换后的非交互证明

证明生成(Prover)

输入:公共参数 par、公钥 X、部分披露消息 mj、私密完整消息 m、私密签名 (A,e)J 为公开分量下标集合,I 为隐藏分量下标集合。

  1. 随机选择 r$Zp

  2. 计算随机化签名点:

    ArA
  3. 计算公开部分承诺:

    CJG1+jJmjHj
  4. 计算辅助点(隐藏签名信息):

    BrC+reA(其中 C=G1+i=1m1Hi
  5. 随机选择:
    α,β$Zp
    对每个隐藏分量 iIδi$Zp

  6. 计算同态承诺:

    UαCJ+βA+iIδiHi
  7. 计算Fiat-Shamir 挑战
    计算

    cH(ctxXmjABU)

    ctx 为领域分隔字符串,例如 "BBS_PoK_1" 或具体应用定义的上下文,防止重放/混淆攻击)

  8. 计算响应:

    sα+rc,tβec

    对每个隐藏分量 iI

    uiδi+rmic

输出证明 π:
[ \pi = \bigl( \overline{A},\ \overline{B},\ U,\ s,\ t,\ {u_i}_{i \in I} \bigr) ]
(共 2 个 G1 点 + (k + 3) 个 Zp 标量k=|I|

验证(Verifier)

输入:parXmj、证明 π

  1. 重新计算公开部分承诺:

    CJG1+jJmjHj
  2. 重新计算挑战(与 Prover 完全相同):

    cH(ctxXmjABU)
  3. 检查两个等式(若任意一个失败则拒绝):
    配对检查(确认随机化签名合法):

    e(A, X2)=?e(B, g2)

    同态检查(确认 B 的表示正确):

    U+cB=?sCJ+tA+iIuiHi

若两个检查都通过,则接受证明(证明者知道有效 BBS 签名且公开消息与 mj 一致)。