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 g1G1,g2G2 有$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 g1G1,g2G2,使得 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=KjH1(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=kiH2(apk,m)+mki
  • 聚合验证: 令 P w = ∑ i ∈ W P i P_w = \sum_{i\in W} P_i Pw=iWPi , S w = ∑ i ∈ W S i S_w = \sum_{i\in W}S_i Sw=iWSi ,验证 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(iW(H2(apk,i),apk))=e(Sw,G)

猜你喜欢

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