BLS签名中与0相关的漏洞

在密码中最有趣的数字是什么?

当然是0

因为0乘以万物都等于0

本文章主要讨论BLS签名中与0相关的漏洞(PS:本文最后简单回顾下BLS签名和BLS聚合签名)

1. Rogue public key attack

假设Alice的私钥为 1 _1 1,其公钥为 X 1 = x 1 ⋅ P 1 ∈ G 1 X_1 = x_1 \cdot P_1 \in G_1 X1=x1P1G1

攻击者Bob可公开他的公钥为 X 2 = x 2 P 1 − X 1 X_2 = x_2P_1 -X_1 X2=x2P1X1 和其签名消息 δ = x 2 H ( m ) \delta = x_2H(m) δ=x2H(m)

尽管Alice没有进行签名,但大家相信这个签名来自Alice和Bob的聚合签名

因为 e ( P 1 , δ ) = e ( P 1 , x 2 H ( m ) ) = e ( x 1 + x 2 , H ( m ) ) e(P_1,\delta) = e(P_1,x_2H(m)) = e(x_1+x_2,H(m)) e(P1,δ)=e(P1,x2H(m))=e(x1+x2,H(m))

3种行之有效的办法阻止这种攻击:

  1. 在验证聚合签名的时候,要求签名消息 m 1 , . . . , m n m_1,...,m_n m1,...,mn不同(个人感觉这个方法比较鸡肋)
  2. 签名的时候要求不能单单对消息签名,要对消息和公钥的级联( m i ∣ ∣ X i m_i || X_i mi∣∣Xi)进行整体签名
  3. 要求签名者提供一个证明来证明他知道私钥,即 P o p P r o v e ( x i ) = Y i = x i ⋅ H ′ ( x i ) PopProve(x_i) = Y_i = x_i \cdot H'(x_i) PopProve(xi)=Yi=xiH(xi) H ′ H' H是另一个哈希函数,验证者首先通过 P o p V e r i f y ( Y i ) PopVerify(Y_i) PopVerify(Yi)验证 e ( X i , H ′ ( X i ) ) = ? e ( P i , Y i ) e(X_i,H'(X_i)) =? e(P_i,Y_i) e(Xi,H(Xi))=?e(Pi,Yi),然后再验证签名 e ( P 1 , δ ) = ? e ( X 1 + . . . + X n , H ( m ) ) e(P_1,\delta) =? e(X_1+...+X_n,H(m)) e(P1,δ)=?e(X1+...+Xn,H(m))

2. Zero bug

如果我们将私钥设为 0 0 0 ,则最后的公钥、签名都为0,且对任何消息的签名都能验证通过

最有效的办法是验证签名的时候校验公钥是不是为0 ,如果公钥是以byte形式出现,那也应该先把它转换成坐标点再校验

3. ”Splitting zero” attack

虽然在签名验证的时候通过校验公钥是不是为0来阻止“Zero Bug”,但有没有一种可能:

X 1 ≠ 0 , X 2 ≠ 0 , δ 0 ≠ 0 , δ 1 ≠ 1 X_1 \neq 0,X_2 \neq 0,\delta_0 \neq 0,\delta_1 \neq 1 X1=0,X2=0,δ0=0,δ1=1,但是 X 1 + X 2 = 0 , δ 1 + δ 2 = 0 X_1+X_2 =0,\delta_1 + \delta_2 =0 X1+X2=0,δ1+δ2=0

以上面为目标,我们来假设一种攻击情景,Alice用它的私钥对消息 m 3 m_3 m3 进行签名,其签名为 δ 3 \delta_3 δ3, 现在攻击者的目标是使验证者相信 δ 3 \delta_3 δ3 是对消息 ( m , m , m 3 ) (m,m,m_3) (m,m,m3)的签名,尽管Alice至始至终没有对消息m签名,攻击者构造如下

  • 随机选择 x 1 x_1 x1作为私钥,其公钥为 X 1 = x 1 ⋅ P X_1=x_1 \cdot P X1=x1P
  • x 2 = − x 1 x_2= - x_1 x2=x1,其公钥为 X 2 = x 2 ⋅ P X_2=x_2 \cdot P X2=x2P

首先 X 1 , X 2 X_1,X_2 X1,X2均不为0,其次 ( x 1 , X 1 ) ( x 2 , X 2 ) (x_1,X_1)(x_2,X_2) (x1,X1)(x2,X2)是合法公钥,能通过PopVerif校验

最后 x 1 + x 2 = 0 x_1+x_2 =0 x1+x2=0,因此 X 1 + X 2 = 0 X_1+X_2 =0 X1+X2=0 δ 1 + δ 2 = x 1 H ( m ) + x 2 H ( m ) = 0 \delta_1+\delta_2 =x_1H(m)+x_2H(m) =0 δ1+δ2=x1H(m)+x2H(m)=0

因此最后的聚合签名 δ = δ 1 + δ 2 + δ 3 = δ 3 \delta = \delta_1+\delta_2+\delta_3 = \delta_3 δ=δ1+δ2+δ3=δ3是有效的

BLS签名:

假设Alice的私钥为 x x x,其公钥为 X = x ⋅ P 1 ∈ G 1 X = x \cdot P_1 \in G_1 X=xP1G1

H H H是哈希函数,能够将消息映射到 G 2 G_2 G2

对消息 m m m,Alice的签名为 δ = x ⋅ H ( m ) \delta = x \cdot H(m) δ=xH(m)

签名验证为 e ( P 1 , δ ) = ? e ( X , H ( m ) ) e(P_1,\delta) =? e(X,H(m)) e(P1,δ)=?e(X,H(m))

BLS聚合签名:

假设有 n n n方,其公私钥对为 x i , X i = x i ⋅ P 1 x_i,X_i= x_i \cdot P_1 xi,Xi=xiP1

每个用户对其消息 m i m_i mi的签名为 δ i = x i ⋅ H ( m i ) \delta_i = x_i \cdot H(m_i) δi=xiH(mi)

最后聚合签名为 δ = ∑ δ i \delta = \sum \delta_i δ=δi

聚合验证为 e ( P 1 , δ ) = ? e ( X 1 , H ( m 1 ) ) . . . e ( X n , H ( m n ) ) e(P_1,\delta) =? e(X_1,H(m_1)) ...e(X_n,H(m_n)) e(P1,δ)=?e(X1,H(m1))...e(Xn,H(mn))

参考:

https://eprint.iacr.org/2021/323.pdf

猜你喜欢

转载自blog.csdn.net/qq_34793644/article/details/129839316
今日推荐