BLS签名算法( 三 )


BLS签名算法

文章插图
和 Schnorr 一样,我们也需要杜绝伪造密钥攻击 。一种方法是要求每个签名参与者证明它拥有公钥对应的私钥(用私钥给公钥签名) 。另一种方法是加入非线性系数,使得攻击无法实施 。要做到这一点,聚合不再是简单的将多个密钥和签名相加,而是将它们分别乘以某个系数后再相加:
S = a1 × S1 + a2 × S2 + a3 × S3
P = a1 × P1 + a2 × P2 + a3 × P3
公式中签名和密钥的系数,可以通过签名者以及其它所有人的公钥计算得出,公式如下:
ai = hash (Pi, {P1, P2, P3})
举个例子,可以简单的将签名者的公钥和所有人公钥拼接在一起算出系数:
ai = hash (Pi || P1|| P2 || P3)
此时,上面的验证公式依然成立 。虽然多了系数ai,但计算逻辑未变 。
该方案的好处是,无需在设备间进行多轮通信,只需知晓其它签名者的相应信息即可 。它可比 Schnorr 算法(需要 3 轮通信)的多重签名方案简单多了 。这个方案也不依赖随机性,是一种具有完全确定性的签名算法 。
4.2 m-n多重签名上面对n-n多重签名进行了介绍,但实际中其实并不是很常见,更常用的是m-n多重签名 。
Schnorr 签名算法中,我们用公钥组成的默克尔树来实现密钥聚合,这种方式效率不高,但是将将堪用 。不幸地是,当 m 和 n 的值变大时,默克尔树的大小会呈指数增长 。
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签名)的签名,所以有:

经验总结扩展阅读