BLS签名

2021-04-15  本文已影响0人  雪落无留痕

BLS签名由Dan Boneh提出,能够将区块中所有的签名组合成单个签名,签名者之间需要进行多轮通信,生成的签名为一个曲线点。

BLS签名需要用到两个新的结构:哈希到曲线(hashing to the curve)以及曲线配对 (curve pairing).

哈希到曲线

BLS签名中,需要稍微修改下哈希算法,可直接哈希到椭圆曲线, 最简单的方法是先对消息进行Hash, 并将结果当作 x 坐标。

曲线配对

双线性对是一种特殊的函数 ,取两个点 PQ, 映射到一个数字:
e(P,Q)\to n
双线性对的性如下:
e(a\cdot P,b\cdot Q)=e(P,Q)^{ab}

BLS签名

若私钥为sk, 公钥为 P=sk\cdot G, 要签名的消息为:m

为了计算签名,需要计算哈希到曲线H(m), 再乘以私钥得到签名:S=sk\cdot H(m)

签名验证:
e(P,H(m))=e(G,S)

BLS聚合签名

若一个区块包含1000笔交易,每个交易都有签名S_i, 公钥 P_im_i 消息。可以聚合签名:
S = S_1+S_2+\cdots+S_{1000}
要验证区块,需要检查下式是否成立:
e(G,S)=e(P_1, H(m_1))\cdot e(P_2,H(m_2))\cdots e(P_{1000},H(m_{1000}))
验证要知道所有的公钥并计算1001个配对函数。

n-of-n 多重签名

若使用多重签名地址,将使用不同的密钥签署相同的交易,可以将它们组合在一起,得到的签名为:S=S_1+S_2+S_3, 密钥P=P_1+P_2+P_3, 此时方程验证依然有效:
e(G,S)=e(P,H(m))
类似于Schnorr, 为了避免密钥免受攻击,每个联合签名者需要证明他们具有公钥的私钥,或者添加非线性元素,即:
S=a_1S_1+a_2S_2+a_3S_3\\ P=a_1P_1+a_2P_2+a_3P_3
签名和密钥的系数根据签名者的公钥和其它公钥确定:
a_i=H(P_i,{P_1,P_2,P_3})

m-of-n 多重签名

BLS构造(m,n)多重签名需要有一个设置阶段进行初始化过程. 下例假设(2,3)签名方案,可以推到(m,n)

初始设置

对于每个签名者 i , 其私钥sk_i 和公钥 P_i=sk_i\cdot G, 计算聚合的公钥为:

P=a_1\cdot P_1+a_2\cdot P_2+a_3\cdot P_3, a_i=H(P_i,{P_1,P_2,P_3})

每个签名者都需要对编号 i签名,聚合这些签名并保存下来:
MK_i=(a_1\cdot sk_1)H(P,i)+(a_2\cdot sk_2)H(P,i)+(a_3\cdot sk_3)H(P,i)
这个签名称为:成员密钥,将用来生成签名,并且:
e(G,MK_i)=e(P,H(P,i))

签名过程

假设用sk_1sk_3签署一笔交易,生成两个签名 S_1S_3:
S_1=sk_1\cdot H(P,m)+MK_1 \\ S_3=sk_3\cdot H(P,m)+MK_3
将他们相加得到单个签名和密钥:
(S',P')=(S_1+S_3, P_1+P_3)
要验证这签名,需要检查:
e(G, S')=e(P',H(P,m))\cdot e(P,H(P,1)+H(P,3))

结论

BLS可聚合签名,节省区块时间,但对于(m,n)多重签名,需要通信进行初始化过程, 并且采用双线性对会导致配对效率低下。

参考

https://eprint.iacr.org/2018/483.pdf
https://blog.csdn.net/BitTribeLab/article/details/102934972

上一篇 下一篇

猜你喜欢

热点阅读