zoukankan      html  css  js  c++  java
  • 门限签名

    摘自:https://blog.csdn.net/qq_38200023/article/details/88045113

    摘自:https://blog.csdn.net/qq_38200023/article/details/88130579

    门限签名(1)——秘密共享

    门限签名(threshold signature区块链中叫多重签名 multisig),即n个用户中有t个签名时,签名有效。
    秘密共享是门限签名的一种特殊情况,即多个用户共享一个秘密,并不是把秘密发给每个人,而是把秘密拆分开发给每个人(当然,也不能直接把信息拆开分发,存在语义上的安全问题),我总结的条件为:
    (1)用户能够验证自己的秘密份额是正确的
    (2)数量足够的用户能够重构秘密
    对于条件(1),就是要让秘密份额满足某个等式,等式中包含公开信息和私人信息,对于条件(2),要求秘密份额包含秘密的信息,一种载体是拉格朗日插值,少于t个信息不能重构t-1次多项式,且都是普通运算,适合搬到有限域。
    我们假设秘密为SSS,构造一个多项式
    F(x)=S+t1l=1xlFlF(x)=S+sum_{l=1}^{t-1}x^l F_lF(x)=S+l=1t1xlFl
    其中,FlF_lFl是有限域中随机选取的元素。
    F(i)F(i)F(i)发送给第iii个用户,且有S=F(0)S=F(0)S=F(0),注意,F(i)F(i)F(i)看上去是一个随机数。
    重构时,F(x)=jΦπΦxjSjF(x)=sum_{jin Phi} pi_{xj}^{Phi}S_jF(x)=jΦπxjΦSj
    其中,πΦxj=ΠmΦ,mjxmjmpi_{xj}^{Phi}=Pi_{min Phi, m eq j}frac{x-m}{j-m}πxjΦ=ΠmΦ,m̸=jjmxm为拉格朗日插值的系数,小于t个已知值时,不能插值得到正确的SSS。

    门限签名(2)——计算安全的可验证秘密共享

    ②计算安全,不存在概率多项式复杂度算法破解,或者遵循某些数学困难假设。
    因为秘密是共享的,某人的秘密份额是否正确需要和其它人的秘密份额作某些计算,实现可验证性需要所有人的信息,包裹在Hash函数中可以验证每个元素是否相等,但无法作计算,而包裹在双线性对中可以作加法、乘法计算。
    用到的双线性对性质:
    e(a,P)e(b,P)=e(a+b,P)e(a,P)e(b,P)=e(a+b,P)e(a,P)e(b,P)=e(a+b,P)
    e(a,P)b=e(ab,P)=e(a,bP)e(a,P)^{b}=e(ab,P)=e(a,bP)e(a,P)b=e(ab,P)=e(a,bP)
    e(aP,bP)=e(abP,P)e(aP,bP)=e(abP,P)e(aP,bP)=e(abP,P)
    流程:
    1 随机选择F1,...,Ft1F_1,...,F_{t-1}F1,...,Ft1以构建多项式F(x)=S+xF1+...+xt1Ft1F(x)=S+xF_1+...+x^{t-1}F_{t-1}F(x)=S+xF1+...+xt1Ft1Si=F(i)S_i=F(i)Si=F(i)为秘密份额,分发给成员1,2,...,n1,2,...,n1,2,...,n
    2 计算并公开α0=e(S,P)alpha_0=e(S,P)α0=e(S,P)以及αj=e(Fj,P),j=1,2...,t1alpha_j=e(F_j,P),j=1,2...,t-1αj=e(Fj,P),j=1,2...,t1,这一步的用意就是你可以用FjF_jFj来计算并验证某些信息,但是不能得到具体值,而Hash函数不能用来计算,所以双线性对确实是一种很强大的工具,需要注意的是,Hash函数基于随机预言机假设,双线性对基于GTI(对于Tate对)假设,很多文献认为后者仍需要经历考验。
    3 验证秘密份额:e(Si,P)=Πt1j=0αijje(S_i,P)=Pi_{j=0}^{t-1} alpha_j^{i^j}e(Si,P)=Πj=0t1αjie(S+sum F_j cdot i^j,P)=e(S_i,P)j证明:
    e(S+Fjij,P)=e(Si,P)e(S+Fjij,P)=e(Si,P)这是该体制的特点,区别于一般秘密共享的地方:可验证性这个体制可以用来分享Hess签名中的私钥

    计算安全:
    wlog,假设1,...,t11,...,t-11,...,t1持有的信息泄露了,攻击者可以通过拉格朗日插值计算以下信息:
    βi=e(Si,P),i=1,...,t1eta_i=e(S_i,P),i=1,...,t-1βi=e(Si,P),i=1,...,t1
    βt=βπt00Πt1j=1απtjjeta_t=eta_0^{pi_{t0}}Pi_{j=1}^{t-1}alpha_j^{pi_{tj}}βt=β0πt0Πj=1t1αjπtj
    注意,βetaβ只是计算的跳板,因为S0S_0S0还是不知道的,直接插值少一个信息,而借助包裹了S0S_0S0的双线性对,就可以插值成功。
    那么攻击者成功有两条路径:
    ①由e(S0,P)e(S_0,P)e(S0,P)计算S0S_0S0
    ②由e(St,P)e(S_t,P)e(St,P)计算StS_tSt,再由S1,S2,...,StS_1,S_2,...,S_tS1,S2,...,St插值得到S0S_0S0
    它们的本质都是一样的,即难度等同于逆向计算双线性对,所以是计算安全的。

  • 相关阅读:
    测试成功的Python中文文件读写脚本
    Solaris 10上Matlab 7(R14)安装手记
    人生:对心物互作的反应
    破解windows登录密码的有效方法
    Java实现二维码QRCode的编码和解码
    java调用储存过程的方法
    Java多态性的两个特殊情况
    Java中的TCP/UDP网络通信编程
    C语言之详解#ifdef等宏及妙用
    26个Jquery使用小技巧
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/13407543.html
Copyright © 2011-2022 走看看