花点时间研究BLS,BBS,BBS+的算法。
数学基础
0 群
一个群(group),可以理解为一个集合 G 搭配一个运算“∗”(比如加法、乘法),需要满足四条规则:
- 封闭性:任取 a,b∈G,计算 a∗b 仍然在 G 里。
- 结合律:(a∗b)∗c=a∗(b∗c)。
- 单位元:存在一个特殊元素 e∈G,使得对任意 a∈G,有 a∗e=e∗a=a。
- 逆元:对任意 a∈G,存在一个 a−1,使得 a∗a−1=a−1∗a=e。
1 循环群
一个群 G 称为循环群,如果存在一个元素 g∈G,使得群中每一个元素都可以写成 g 的幂次:
G={g0,g1,g2,…,gn−1}
其中 n 是群的阶(即元素个数),并且有 gn=e(回到单位元)。
这个特殊的元素 g,叫做生成元(generator)。
例子:模 7 加法群
集合:{0,1,2,3,4,5,6},运算是“模 7 加法”。
- 生成元可以是 1,因为
0,1,(1+1)mod7=2,(1+1+1)mod7=3,…,6
就把整个集合生成了。
所以 Z7 是一个循环群。
“设 G=⟨g⟩ 是阶为 n 的循环群”:
- G:一个群;
- ⟨g⟩:表示由元素 g 生成的群(即所有 gk 的集合);
- “阶为 n”:群里总共有 n 个不同的元素;
- 总结:G 是一个循环群,它的所有元素都能写成 gk 的形式,且一共 n 个。
1.1 有限域乘法群 Fp\*
-
设 p 是一个素数;
-
Fp={0,1,2,…,p−1},运算是模 p 加法和模 p 乘法;
-
Fp 称为有限域,因为它是一个有限的数集,且加减乘除(除零外)都有意义。
-
考虑非零元素:Fp\*={1,2,…,p−1},在模 p 乘法下形成一个群;
-
群的阶是 p−1(因为零被排除)。
-
重要事实:Fp\* 是一个循环群。
- 意味着存在一个生成元 g,使得
Fp\*={g1,g2,…,gp−1}(modp)
取 p=7:F7\*={1,2,3,4,5,6}。
1.2 椭圆曲线群
椭圆曲线方程
-
在有限域 Fp 上定义曲线:
E:y2≡x3+ax+b(modp)
其中参数 a,b∈Fp,且满足判别式 4a3+27b2≡0(modp),保证曲线“非奇异”。
-
曲线上的点集合:
E(Fp)={(x,y)∈Fp2∣y2≡x3+ax+b}∪{O}
其中 O 是“无穷远点”,充当群的单位元。
群运算(点加法)
- 定义了一个“点加法”运算 ⊕,满足群的四条性质。
- 直观几何解释(在实数域里):
- 过点 P,Q 作直线,交椭圆曲线于第三点 R,再取其对称点 −R,定义为 P+Q。
- 在有限域上,这个过程转化为代数公式(斜率、模逆元等)。
2 离散对数问题(DLP)
2.1 定义
在素数阶循环群 G=⟨g⟩ 上:
- 离散对数问题(DLP):给定 g,y=gx,求 x。
2.2 为什么难解?
没有闭式公式
在实数域里,log 是指数函数的反函数;但在模运算下(有限域/椭圆曲线),不存在类似的解析反函数。
指数运算像“乱洗牌”
当模数 p 很大时,序列 g1,g2,… 在 Fp\* 看起来几乎是随机均匀分布的。已知一个值 y,几乎没有比逐一尝试更快的方法。
暴力搜索代价巨大
群阶若为 n,最笨的办法是试 g1,g2,…,gn,复杂度 O(n)。如果 n 大约是 2256,即便用超级计算机也完全不可能。
通用攻击(不依赖群结构)
- Baby-Step Giant-Step (BSGS):时间与空间都是 O(n)。
- Pollard ρ:时间 O(n),空间极小 → 实际攻击基线。
特殊攻击(利用群结构)
- 有限域 Fp\*:有 次指数算法(Index Calculus / Number Field Sieve for DLP)。
- 复杂度约 exp((logp)1/3(loglogp)2/3),比 p 快得多。
- 👉 因此在有限域上必须用很大的 p(如 3072 位)才能达到 128-bit 安全。
- 椭圆曲线群 ECDLP:目前没有次指数算法,最好的还是 O(n)(Pollard ρ)。
- 👉 因此 256 位阶的曲线群就能提供 ~128-bit 安全,比有限域高效很多。
3 双线性群(bilinear group)
一个 双线性群系统 通常由三部分组成:
(G1,G2,GT,e)
- G1,G2,GT:都是阶为大素数 p 的循环群;
- g1∈G1,g2∈G2:生成元;
- e:G1×G2→GT:一个双线性映射(bilinear map,也叫“配对”)。
e 必须满足以下三个条件:
-
双线性(bilinearity)
对所有 u∈G1,v∈G2,a,b∈Zp,有
e(ua,vb)=e(u,v)ab
👉 这条性质最重要:指数“乘”在映射里变成了“指数积”。
-
非退化性(non-degeneracy)
e(g1,g2)=1
否则映射就没信息量。
-
有效可计算(computability)
给定 u∈G1,v∈G2,能在多项式时间内算出 e(u,v)。
可以根据定义推导出 G1→GT 和 G2→GT 是群同态的。
群同态
设有两个群:
- 群 G,运算写作 ⋅,单位元记作 eG。
- 群 H,运算写作 ∗,单位元记作 eH。
一个函数 f:G→H 如果满足:
f(a⋅b)=f(a)∗f(b),∀a,b∈G,
就叫做 群同态。
直观理解,可以把群同态理解成一个“保持结构的变换”:
- 在原群里做运算,再映射;
- 和先映射,再在目标群里运算,结果一样。
推导
在双线性群中有配对映射
e:G1×G2→GT.
固定第二个参数 v∈G2,得到一个函数:
fv:G1→GT,fv(u)=e(u,v).
要验证它是群同态:
fv(u1⋅u2)=e(u1⋅u2,v)=e(g1a⋅g1b,v)=e(g1a+b,v)=e(g1,v)a+b=e(g1,v)ae(g1,v)b=e(g1a,v)e(g1b,v)=e(u1,v)⋅e(u2,v)=fv(u1)⋅fv(u2).
4 强 Diffie–Hellman 假设(q-SDH)
4.1 普通 Diffie–Hellman 假设
- 计算型 Diffie–Hellman(CDH):给定 (g,ga,gb),计算 gab。
- 判定型 Diffie–Hellman(DDH):给定 (g,ga,gb,gc),判断 c=?ab。
这些假设都基于离散对数问题的难解性。
无法通过 y=gx 推导出 x=loggy 。没有多项式时间内的对数运算。
4.2 强 Diffie–Hellman (q-SDH) 假设的定义
SDH 假设是在 双线性群(bilinear group) 上定义的,常用于群签名、短签名等方案。
-
设 G 是一个阶为质数 p 的循环群,生成元为 g。
-
给定一个秘密数 x∈Zp∗,公开 (g,gx,gx2,…,gxq)。
-
问题:在不知道 x 的情况下,计算任意形式为
(c,gx+c1)
的对,其中 c∈Zp 自由选择。
q-SDH 假设:认为在公开 (g,gx,gx2,…,gxq) 的条件下,任何多项式时间的算法几乎不可能输出一个新的合法对 (c,g1/(x+c))。
BLS
1 直觉
选择大素数 p 的三个循环群:G1,G2,GT,阶均为 p。
生成元:g1∈G1,g2∈G2。
配对:e:G1×G2→GT,双线性、非退化、可计算。
哈希到曲线:H:{0,1}\*→G1(或到 G2),把消息映射到群点(需用正规 hash-to-curve 方案)。
假设签名在 G1、公钥在 G2;
BLS 的核心是利用双线性配对把“指数上的乘法”显式化:
若 e 是配对,满足 e(ga,hb)=e(g,h)ab。
令签名 σ=H(m)x(在某个群里),公钥 pk=gx(在另一个群里),则验证:
e(σ,g)=?e(H(m),pk)
因为左边 =e(H(m)x,g)=e(H(m),g)x,右边 =e(H(m),gx),两边相等说明确由同一私钥 x 产生。
2 流程
-
密钥生成
选私钥 x \xleftarrow{\}\mathbb{Z}_p^*$。
公钥 pk=g2x(若签名在 G1)。
-
签名(消息 m)
- P←H(m)∈G1。将消息哈希到曲线。
- σ←Px∈G1。
-
检查
e(σ,g2)=e(H(m)x,g2)=e(H(m),g2x)=e(H(m),pk)
检查方拿到签名 σ 和消息m ,已知 g2 和 pk ,即可验证签名是否正确。
3 聚合签名
设定与符号
- 配对群:(G1,G2,GT,e),阶为素数 p,生成元 g1∈G1,g2∈G2。
- 哈希到曲线:H:{0,1}\*→G1(也可反过来放到 G2,下同)。
- 第 i 个签名者私钥 xi∈Zp\*,公钥 pki=g2xi。
- 对消息 m 的 BLS 签名:σ=H(m)x∈G1。
输入
一批三元组 (pki,mi,σi),其中
σi=H(mi)xi∈G1
聚合
σagg=i=1∏nσi∈G1.
这就是把各签名(群元素)相乘(椭圆曲线是“点加/标量乘”的对应群运算;在 G1 里用群运算累乘即可)。
验证
e(σagg,g2)=e(i∏H(mi)xi,g2)=i∏e(H(mi)xi,g2)=i∏e(H(mi),g2)xi=i∏e(H(mi),g2xi)=i∏e(H(mi),pki).
4 为什么聚合签名验证更快
具体公式推导没有看懂,总之可以分成两种运算,其中可合并ML后运算FE。
对单个配对 e(P,Q) 来说:
-
Miller loop (ML):算出 fr,Q(P)∈Fpk\*,但它还没在目标子群 GT;
-
Final exp (FE):把结果提到指数 (pk−1)/r,得到
e(P,Q)=fr,Q(P)(pk−1)/r∈GT.
所以配对的“真正结果” = ML 输出 + 一次 FE。
对于逐个验证:
e(σi,g2)=e(H(mi),pki)
需要做 2n 次 ML + 2n 次 FE。
而聚合签名:
e(σagg,g2)=i∏e(H(mi),pki)
左侧做 1次ML + 1次FE,右侧可合并ML后做FE,即 n 次 ML + 1次 FE。
总共 n+1 次ML + 2次 FE。
BBS
1 作用
BBS(Boneh–Boyen–Shacham,2004)主要提出的是一种短群签名方案。它的作用可以用三句话概括:
-
匿名签名
群签名的核心功能:群里任何一个成员都能代表整个群签名,但外部验证者只能知道“这是群里某个人签的”,而不知道具体是谁。
-
可追踪性
系统里有一个“管理者/开盖者”,在必要的时候(例如发生违法、作恶行为),可以打开匿名性,查出具体是谁签的。
-
高效与简洁
在 BBS04 方案里,签名长度非常短(≈ 一个常规 RSA 签名大小),且验证效率高,满足当时一些实际应用(如 可信计算 attestation、车联网安全广播)对“匿名+短消息签名”的需求。
2 流程
设定与符号
-
选定双线性群:
- 两个椭圆曲线群 G1,G2,阶为素数 p;
- 生成元 g1∈G1,g2∈G2;
- 双线性配对 e:G1×G2→GT。
-
管理者生成秘密:
- 随机挑 γ∈Zp;
- 公钥元素 w=g2γ∈G2。
- w 在追踪时会用到。
-
每个群成员的私钥:
这样,每个成员的身份 = (Ai,xi)。
签名
群成员 i 要签消息 M:
-
先把消息映射到 h=H(M)∈G1。
(这里 H 是 hash-to-curve)
-
成员用私钥 (Ai,xi) 生成签名:
-
随机选 r∈Zp;
-
计算:
T1=Ai⋅hr∈G1,
T2=g1r∈G1,
T3=wr+xi∈G2.
-
再加一个 零知识证明 π:证明“在不透露 Ai,xi 的前提下,确实有 Ai,xi 是有效成员凭证”。
-
签名整体是:
σ=(T1,T2,T3,π).
验证
验证者拿到 σ=(T1,T2,T3,π),做:
-
验证零知识证明 π,保证签名者确实持有有效的成员凭证;
-
检查配对等式是否成立,例如:
e(T1,g2)=?e(h,T3)⋅e(T2,w).
这个等式成立,当且仅当签名确实来自某个有效成员。
因为整个过程中没有暴露 xi,外部无法知道具体是谁签的 → 匿名性。
追踪
如果需要“开盖”,群管理者可以用秘密 γ 来解出签名者:
- 管理者有 γ,知道 T3=wr+xi=g2γ(r+xi)。
- 结合 T2=g1r,可以还原出与成员身份绑定的元素,从而确定是哪个 xi。
这样就能追踪出签名者身份。
其中的“零知识证明”
签名后还有一个零知识证明,证明 T1 T2 T3 是有效的。
这里用到的就是之前提过的非交互式零知识证明,
承诺
- 签名者挑一些随机数 s1,s2,
- 计算若干承诺值(类似“我先放几个锁住的盒子”),记为 C1,C2,…,
- 这些是群元素(点或指数),依赖 s1,s2,但不依赖秘密 (Ai,xi)。
挑战
响应
- 签名者用秘密 (Ai,xi) 和随机数 s1,s2,结合挑战 c,计算响应值 z1,z2,…。
- 这些响应能让验证者确认等式成立,但不会暴露 (Ai,xi)。
验证
验证者收到:(C1,…,c,z1,z2,…)。
他会检查一组等式,比如:
Check: C1⋅T1c=?g1z1,C2⋅T2c=?wz2,…
这些等式保证:
- 如果签名者没有正确的 (Ai,xi),就几乎不可能通过验证;
- 如果签名者有合法参数,那么响应一定能满足这些验证等式;
- 验证者无法从 (C,z) 推出 (Ai,xi),因为它们被随机化隐藏了。
BBS+
1 作用
不是BBS的增强版!
BBS+更多表示在结构上参考了BBS,但是两者作用完全不同。
BBS+不具备群签名、可追踪等功能。
他的作用更加直接:多消息签名+选择性披露。
- 可以对一组消息 (m1,…,mk) 签名;
- 签名长度固定(3 个群元素),和消息数无关;
- 支持 选择性披露:持有人能证明“我有一个覆盖所有消息的签名”,但只展示其中一部分;
2 流程
设定与符号
- 选双线性配对 (G1,G2,GT,e),阶为素数 p,生成元 g1∈G1,g2∈G2
- 取额外基元:u,h1,…,hℓ∈G1(用于“多消息”与盲化)
- 签名者密钥:随机 x∈Zp;公钥:W=g2x∈G2
- Hash-to-curve:H:{0,1}\*→G1(仅当需要把任意消息先映到群;BBS+常直接把整数消息当指数)
参数:pp=(G1,G2,GT,e,p;g1,g2,u,h1,…,hℓ)。
密钥:sk=x,pk=W=g2x。
签名
要签 ℓ 条消息 m1,…,mℓ∈Zp。
-
采样随机 e,s←Zp
-
计算“消息基底”:
B=g1⋅us⋅i=1∏ℓhimi∈G1
补充说明 himi 的运算:要先把 mi hash to scalar,映射到整数域。
-
计算
A=B1/(x+e)∈G1(即 Ax+e=B)
-
输出签名:σ=(A,e,s)
直觉:(A,e,s) 使得 e(A,W⋅g2e)=e(B,g2),从而把“消息向量”压进一条等式里;签名长度固定 3 个元素,与消息条数无关。
验证
给定 σ=(A,e,s)、公钥 W 与消息 m1,…,mℓ:
-
复算
B=g1⋅us⋅i=1∏ℓhimi∈G1
-
检查配对等式
e(A,W⋅g2e)=?e(B,g2)
若成立则验签通过。
选择性披露
目标:已持有 BBS+ 签名 σ=(A,e,s) 覆盖的消息向量 (m1,…,mℓ),现在只公开其中一部分索引集合 R 的消息 {mi:i∈R},而把其余 H={1,…,ℓ}∖R 隐藏;同时向验证者零知识证明:确实存在隐藏消息与签名使得原验证等式成立。
要证明的语句(正式 PoK 声明)
证明者要给出一个非交互零知识证明,证明如下命题成立:
PoK{A,e,s,{mi}i∈H:e(A,W⋅g2e)=e(g1⋅us⋅∏i=1ℓhimi,g2)且对所有 i∈R,mi 等于已公开的值 mi\*}.
这句话的含义:验证者只拿到 {mi\*:i∈R} 与一个 NIZK 证明;验证者被说服:确实存在某些隐藏消息 {mi:i∈H} 和 (A,e,s) 使上式成立,但看不见这些秘密的具体数值。
证明与验证的结构(Σ-协议 + Fiat–Shamir,示意)
- 承诺(Prover):
选择盲化随机数(对 e,s 和每个隐藏 mi 都选一份),基于等式右侧的乘法线性与配对的双线性,构造一组承诺值(群元素),把“隐藏消息的线性组合”锁进去;
- 挑战:
用 Fiat–Shamir:c=H(承诺∥上下文/域分离∥已公开消息);
- 响应(Prover):
计算响应向量 (ze,zs,{zi}i∈H),它们是“盲化量 + 挑战 × 真值”的线性组合;
- 验证(Verifier):
依据响应
- 并检查一组等式是否成立(等价于把“挑战”分离开后,回到原始配对关系的加法/乘法同态形式)。若全部成立,则验明:上面的 PoK 语句为真。
关键点:
- 公开消息集合 R 直接放进验证等式;
- 隐藏消息集合 H 仅通过承诺与响应“出现”为指数上的线性项,验证者无法反推出具体数值;
- 整个证明能与不同会话不可链接(因有新盲化随机数);
- 安全性基于配对群里的 CDH/SDH 类假设与随机预言机(Fiat–Shamir)模型。