BLS签名

作者: 雪落无留痕 | 来源:发表于2021-04-15 23:47 被阅读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

    相关文章

      网友评论

          本文标题:BLS签名

          本文链接:https://www.haomeiwen.com/subject/nulslltx.html