在密码中最有趣的数字是什么?
当然是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=x1⋅P1∈G1
攻击者Bob可公开他的公钥为 X 2 = x 2 P 1 − X 1 X_2 = x_2P_1 -X_1 X2=x2P1−X1 和其签名消息 δ = 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种行之有效的办法阻止这种攻击:
- 在验证聚合签名的时候,要求签名消息 m 1 , . . . , m n m_1,...,m_n m1,...,mn不同(个人感觉这个方法比较鸡肋)
- 签名的时候要求不能单单对消息签名,要对消息和公钥的级联( m i ∣ ∣ X i m_i || X_i mi∣∣Xi)进行整体签名
- 要求签名者提供一个证明来证明他知道私钥,即 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=xi⋅H′(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=x1⋅P
- 令 x 2 = − x 1 x_2= - x_1 x2=−x1,其公钥为 X 2 = x 2 ⋅ P X_2=x_2 \cdot P X2=x2⋅P
首先 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=x⋅P1∈G1
H H H是哈希函数,能够将消息映射到 G 2 G_2 G2
对消息 m m m,Alice的签名为 δ = x ⋅ H ( m ) \delta = x \cdot H(m) δ=x⋅H(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=xi⋅P1
每个用户对其消息 m i m_i mi的签名为 δ i = x i ⋅ H ( m i ) \delta_i = x_i \cdot H(m_i) δi=xi⋅H(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://www.toymoban.com/news/detail-400423.html
参考:
https://eprint.iacr.org/2021/323.pdf文章来源地址https://www.toymoban.com/news/detail-400423.html
到了这里,关于BLS签名中与0相关的漏洞的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!