门限签名

摘自: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_{j\in \Phi} \pi_{xj}^{\Phi}S_jF(x)=jΦπxjΦSj
其中,πΦxj=ΠmΦ,mjxmjm\pi_{xj}^{\Phi}=\Pi_{m\in \Phi, m\neq 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...,t1\alpha_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,...,t1\beta_i=e(S_i,P),i=1,...,t-1βi=e(Si,P),i=1,...,t1
βt=βπt00Πt1j=1απtjj\beta_t=\beta_0^{\pi_{t0}}\Pi_{j=1}^{t-1}\alpha_j^{\pi_{tj}}βt=β0πt0Πj=1t1αjπtj
注意,β\betaβ只是计算的跳板,因为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
它们的本质都是一样的,即难度等同于逆向计算双线性对,所以是计算安全的。

posted @ 2020-07-31 02:39  LiuYanYGZ  阅读(768)  评论(0编辑  收藏  举报