Skip to content

BBS 签名 ​

Revisiting BBS Signatures

BBS+ Applications, Standardization, and a Bit of Theory

ietf-BBS草案

w3.org

w3.org-

BBS 基本流程 ​

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

假设我们有 l 条消息:

G1←$G1H1,…,Hl←$G1G2←$G2∗par←(G1,G2,GT,e,G1,H1,G2)

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

2. 密钥生成(BBS.KG) ​

输入 par,执行:

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

返回 (sk,vk)。

3. 签名生成(BBS.Sign) ​

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

  1. 计算消息承诺:C←G1+∑i=1lmi⋅Hi∈G1
  2. 随机选择标量 e:e←$Zp
  3. 计算签名:A←1x+eC∈G1

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

4. 签名验证(BBS.Ver) ​

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

  1. 重新计算承诺:C←G1+∑i=1ℓmi⋅Hi
  2. 检查配对等式:e(A, X+eG2)=?e(C,G2)

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

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+e⋅G2)=e(C, G2)

验证等式恒成立。

6. 存在的问题 ​

对于签名 σ=(A=Cx+e,e) 来说,攻击者容易伪造 σ′=(A2=C2x+e,e) 也是一个对承诺 C2 的有效签名。

7. 盲签名构造 ​

非常简单,只需在发送承诺 C 时构造一个随机值变换为 rC 即可, 在接受到签名 A=rCx+e 时能很容易消去。

零知识披露 ​

BBS 的 Σ-协议

公共输入(Verifier 已知):

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

私密输入(Prover 知道):

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

目标:Prover 向 Verifier 证明存在 (m,A,e) 使得 BBS.Ver 接受,同时隐藏 A,e 以及 mi∈I。

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

Mark: 同态承诺 -> [Proofs, Arguments, and Zero-Knowledge, 12.3]

Prover(P1):

  1. 随机 r←$Zp∗

  2. 计算随机化签名点:

    A―←r⋅A
  3. 计算辅助点:

    C←G1+∑i=1ℓmi⋅HiB―←r⋅C−r⋅e⋅A
  4. 随机 α,β←$Zp

  5. 计算同态承诺:

    U←α⋅C+β⋅A―

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

Verifier 发送挑战:

c←$Zp

Prover(P2)响应:

s←α+r⋅c,t←β−e⋅c

发送 (s,t)

FS变换:

Prover 计算

c=Hash(ctx||A¯||B¯||U)

发送 (A¯,B¯,U,s,t)

Verifier 检查(PoK.V):

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

    lhs==e(r⋅A,X)=e(A,rxG2)rhs==e(r⋅C−r⋅e⋅A,G2)=e(C−eCx+e,rG2)=e(xCx+e,rG2)=e(Cx+e,xrG2)=e(A,rxG2)=lhs
  2. 同态检查:

lhs=U+c⋅B―=αC+βA―+c(rC−reA)=(α+rc)C+(β−re)A―=sC+tA―=rhs

2. 部分披露(Partial Disclosure,对于Verifier隐藏部分消息) ​

Prover(P1):

  1. 随机 r←$Zp∗

  2. 计算 A―←r⋅A

  3. 计算公开部分承诺:

    CJ←G1+∑j∈Jmj⋅Hj
  4. 计算隐藏部分的辅助点:

    B―←r⋅C−r⋅e⋅A
  5. 随机 α,β←$Zp,并对每个隐藏分量 i∈I 随机 δi←$Zp

  6. 计算同态承诺(现在包含隐藏分量):

    U←αCJ+βA―+∑i∈Iδi⋅Hi

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

Verifier 发送挑战 c←$Zp

Prover(P2)响应:

s←α+r⋅c,t←β−e⋅c

对每个隐藏分量:

ui←δi+r⋅mi⋅c(∀i∈I)

发送 (s,t,{ui}i∈I)

Verifier 检查(PoK.V):

  1. 配对检查(同上):e(A―, X)=?e(B―, G2)
  2. 同态检查(现在使用公开部分 + 隐藏响应):U+c⋅B―=?s⋅CJ+t⋅A―+∑i∈Iui⋅Hi

FS 变换后的非交互证明 ​

证明生成(Prover) ​

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

  1. 随机选择 r←$Zp∗

  2. 计算随机化签名点:

    A―←r⋅A
  3. 计算公开部分承诺:

    CJ←G1+∑j∈Jmj⋅Hj
  4. 计算辅助点(隐藏签名信息):

    B―←r⋅C−r⋅e⋅A(其中 C=G1+∑l=1ℓml⋅Hl)
  5. 随机选择:
    α,β←$Zp
    对每个隐藏分量 i∈I:δi←$Zp

  6. 计算同态承诺:

    U←αCJ+βA―+∑i∈Iδi⋅Hi
  7. 计算Fiat-Shamir 挑战:
    计算

    c←H(ctx‖mj‖A―‖B―‖U)

    (ctx 为领域分隔字符串,例如 "BBS_PoK_1||ChainID" 或具体应用定义的上下文,防止重放/混淆攻击,例如在Dapp1生成的c用到了Dapp2中)

  8. 计算响应:

    s←α+r⋅c,t←β−e⋅c

    对每个隐藏分量 i∈I:

    ui←δi+r⋅mi⋅c

输出证明 π:

π=(A―, B―, U, s, t, {ui}i∈I)

(共 2 个 G1 点 + (k + 3) 个 Zp 标量,k=|I|)

验证(Verifier) ​

输入:par、X、mj、证明 π。

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

    CJ←G1+∑j∈Jmj⋅Hj
  2. 重新计算挑战(与 Prover 完全相同):

    c′←H(ctx‖mj‖A―‖B―‖U)
  3. 检查两个等式(若任意一个失败则拒绝):
    配对检查(确认随机化签名合法):

    e(A―, X2)=?e(B―, G2)

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

    U+c′⋅B―=?s⋅CJ+t⋅A―+∑i∈Iui⋅Hi

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