本文主要是介绍BLS12-381 and BLS Signatures,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
BLS12-381 and BLS Signatures
椭 圆曲线密码算法具有密钥短的优点,为了达到128 bit的安全水平,NIST (美国国家标准与技术研究院)推荐使用 3072 bit 的RSA密钥 ,而椭圆曲线密码算法仅需要256 bit就能达到同等安全强度,这使得密钥长度大大缩短,因而大受欢迎。
一. BLS12-381简介
BLS12-381是Pairing-Friendly的椭圆曲线,Pairing-Friendly的椭圆曲线要满足两点:1.具有大素数阶子群;2.嵌入次数要小。BLS12-381就满足以上两种性质,BLS12-381 名称中的 12是指嵌入次数 ,381是指模数
二. bilinear pairing
令G1和G2分别为加法群,GT是乘法群,一个双线性对 e 就是一个从$G_1* G_2 $到 GT 的双线性映射,并满足下面性质
- 双线性:设 g 1 ∈ G 1 , g 2 ∈ G 2 g_1\in G_1,g_2 \in G_2 g1∈G1,g2∈G2 有$e(g_1a,g_2b) =e(g_1,g_2)^{ab} $
- 非退化性:存在 g 1 ∈ G 1 , g 2 ∈ G 2 g_1\in G_1,g_2 \in G_2 g1∈G1,g2∈G2,使得 e ( g 1 , g 2 ) ≠ 1 e(g_1,g_2)\neq 1 e(g1,g2)=1
- 可计算性:存在有效算法可以计算 e
并不是所有椭圆曲线都可以实现上面的bilinear pairing,我们把能实现 bilinear pairing的椭圆曲线,称为Pairing-Friendly Curves。Pairing-Friendly Curves 主要有两类: BN 曲线和BLS 曲线
三. BLS签名
BLS 签名方案于2001年提出,BLS签名除了正常签名之外,还可以实现签名聚合,以减少通信开销和加快签名验证。BLS 签名可以基于BLS12-381曲线实现,需要说明的是BLS签名比 BLS 曲线提出时间要早,其中BLS都是三个人名的简写,但BLS签名和BLS曲线中只有L是同一个人,B和S都是不同的人,只是恰巧简写一样而已。
BLS 签名算法是基于双线性映射构造的一种加密算法,算法如下:
- 生成密钥:生成私钥k,计算公钥 P=kG
- 签名生成:对消息 m ,将其映射到曲线上的一个点,记为H,签名 S = kH
- 签名验证 e ( P , H ) = ? e ( G , S ) e(P,H) =? e(G,S) e(P,H)=?e(G,S)
四. BLS聚合
BLS聚合签名简单分为一下三类
-
对不同一消息签名的聚合
-
对同一消息签名的n-n聚合(即n-n多重签名)
-
对同一消息签名的m-n聚合(即m-n多重签名)
4.1 对不同消息签名的聚合
-
生成密钥:每一个用户生成私钥ki,计算公钥 Pi=kiG
-
签名生成:对消息mi ,将其映射到曲线上的一个点,记为Hi, Si = kiHi
-
签名聚合 S = ∑ S i S = \sum S_i S=∑Si
-
聚合验证 e ( G , S ) = ? ∏ e ( P i , H i ) e(G,S) =? \prod e(P_i,H_i) e(G,S)=?∏e(Pi,Hi)
4.2 对同一消息签名的n-n聚合: 设签名消息为 m ,将其映射到曲线上的一个点,记为H
- 生成密钥:对每一个用户生成私钥ki,计算公钥 Pi=kiG
- 签名生成: Si = kiH
- 签名聚合 S = ∑ S i S = \sum S_i S=∑Si
- 聚合验证 e ( G , S ) = ? e ( ∑ P i , H ) e(G,S) =? e(\sum P_i,H) e(G,S)=?e(∑Pi,H)
上述聚合看似完美,但存在rogue-key attacks,举个例子: 用户1的公钥为P1 ,用户2的公钥为P2,但用户2对外宣称其公钥为P‘ = p1 -P2,最后用户2可以制造用户1和用户2的聚合签名,有以下两种方式可以防止rogue-key attacks
-
要求每个签名者证明它拥有公钥对应的私钥
-
加入非线性系数:使得P = a1×P1+a2×P2+a3×P3
下面介绍使用一种使用非线性系数来抵抗rogue-key attacks的算法
- 生成密钥:每一个用户生成私钥ki,计算公钥 Pi=kiG
- 签名生成: Si = ki * h(Pi) * H //h: 哈希算法,将点哈希到标量
- 签名聚合 S = ∑ S i S = \sum S_i S=∑Si
- 聚合验证 e ( G , S ) = ? e ( ∑ h ( P i ) P i , H ) e(G,S) =? e(\sum h(P_i) P_i,H) e(G,S)=?e(∑h(Pi)Pi,H)
4.3对同一消息签名的t-n聚合(即t-n多重签名)
- 生成密钥:每一个用户生成私钥ki,计算公钥 Pi=kiG
- 公钥聚合: a p k = ∑ H 1 ( p i ) ⋅ p i apk = \sum {H_1(p_i)}· p_i apk=∑H1(pi)⋅pi // H1: 哈希到标量,H2 哈希到点
- 计算成员私钥: m k i = ∑ j = 0 n U i , j , U i , j = K j ⋅ H 1 ( P j ) ⋅ H 2 ( a p k , i ) mk_i = \sum_{j=0}^{n} U_{i,j}, U_{i,j} = K_j·H_1(P_j)·H_2(apk,i) mki=∑j=0nUi,j,Ui,j=Kj⋅H1(Pj)⋅H2(apk,i) , U i , j U_{i,j} Ui,j 为第j个用户计算发第i个用户的
- 成员密钥验证: e ( G , m k i ) = ? e ( a p k , H 2 ( a p k , i ) ) e(G,mk_i) =? e(apk,H_2(apk,i)) e(G,mki)=?e(apk,H2(apk,i)), 通过此验证可确保成员密钥的正确性
- 签名生成:设签名人数为t,其构成的集合为W,t个人分别计算签名 S i = k i ⋅ H 2 ( a p k , m ) + m k i S_i = k_i·H_2(apk,m) + mk_i Si=ki⋅H2(apk,m)+mki
- 聚合验证: 令 P w = ∑ i ∈ W P i P_w = \sum_{i\in W} P_i Pw=∑i∈WPi , S w = ∑ i ∈ W S i S_w = \sum_{i\in W}S_i Sw=∑i∈WSi ,验证 e ( H 2 ( a p k , m ) , P w ) ⋅ e ( ∑ i ∈ W ( H 2 ( a p k , i ) , a p k ) ) = e ( S w , G ) e(H_2(apk,m),P_w)·e(\sum_{i\in W}(H_2(apk,i),apk)) = e(S_w,G) e(H2(apk,m),Pw)⋅e(∑i∈W(H2(apk,i),apk))=e(Sw,G)
这篇关于BLS12-381 and BLS Signatures的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!