BLS签名算法( 三 )


BLS 使用了另一种方法,不过略复杂 。我们需要一个普通哈希函数hash(x)(结果为一个数)和一个曲线哈希函数H(x) 。开始多重签名时 , 还需要一个初始化过程,这之后,签名者之间就不再需要通信了,只需提供交易签名即可 。
下面举个例子,我们要创建一个 2-3 多重签名 , 3 个签名存储在不同的设备上(这个例子可以扩展为任意的 m-n 多重签名) 。
  (1)生成成员密钥
用 i = 1,2,3 来表示集合中相应位置的设备,用pki表示私钥,用Pi = pki×G表示公钥 。我们用前面说的方法来聚合公钥:
P = a1 × P1 + a2 × P2 + a3 × P3
其中,ai = hash (Pi, {P1, P2, P3}) .
现在,每个设备都需要对每个i签名,以证明该i是聚合公钥中的一员 。将签名聚合后,保存在对应的设备中:
MKi = (a1 × pk1) × H( P , i ) + (a2 × pk2) × H( P , i ) + (a3 × pk3) × H( P , i ) 
这个签名被称作“成员密钥”,稍后签名时我们会用到 。每个成员密钥都是对消息体H( P , i ) 的 n-n 多重签名,即:
e (G, MKi) = e (P, H(P , i) )
证明如下:

BLS签名算法

文章插图
记住这个等式,稍后还会用到 。它用来证明某个设备是多重签名中的合法参与者 。
  (2)签名
假设现在用pk1和 pk3对交易进行签名 , 会生成两个签名S1和S3:
S1 = pk1 × H(P,m) + MK1
S3 = pk3 × H(P,m) + MK3
将它们加起来,聚合成单一的签名和公钥:
(S', P') = (S1+S3, P1+P3)
用P'和S', 是为了强调它们只是由部分签名者参与计算的(公钥和签名),而不像 P 那样是由所有签名者参与计算的(公钥) 。为了验证 2-3 多重签名,需证明如下等式成立:
e(G,S') = e(P',H(P,m)) × e(P,H(P,1)+H(P,3))
上面说过,成员密钥 MK1 和   MK3 是对消息 H(P,1) 和  H(P,3)(消息本身由聚合公钥P签名)的签名,所以有:
BLS签名算法

文章插图
证明完毕 。比 n-n 多重签名复杂一些,但仍然可以理解 。
五、缺点① 配对函数并不是十分高效
② 存在一种针对椭圆曲线加密体系的攻击-MOV攻击 。该攻击能够利用配对函数来危害系统安全 。所以对配对函数的使用要十分谨慎 。
参考文献
[1] Boneh D , Lynn B , Shacham H . Short Signatures from the Weil Pairing[J]. Springer, Berlin, Heidelberg, 2001.
[2] 理解 BLS 签名算法

推荐阅读