本文首发公众号VenusBlockChain,关注公众号后可免费阅读!VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们,欢迎关注。
门限签名是普通数字签名的一个重要分支,是门限秘密共享技术和数字签名的一种结合。1991年,Desmedt-Frankel首次提出了 ( t , n ) (t,n) (t,n)门限签名方案。 ( t , n ) (t,n) (t,n)门限签名方案是指由 n n n 个成员组成一个签名群体,该群体有一对公钥和私钥,群体内大于等于 t t t 个合法、诚实的成员组合可以代表群体用群私钥进行签名,任何人可利用该群体的公钥进行签名验证。这里 t t t 是门限值,只有大于等于 t t t 个合法成员才能代表群体进行签名,群体中任何 t − 1 t-1 t−1个或更少的成员不能代表该群体进行签名,同时任何成员不能假冒其他成员进行签名。采用门限签名方式可以实现权力分配,避免滥用职权。
本算法[1]由IBM实验室提出,算法有以下特点:
1. it is unforgeable and robust in the random oracle model, assuming the RSA problem is hard;
2. signature share generation and verification is completely non-inter-active;
3. the size of an individual signature share is bounded by a constant times the size of the RSA modulus.
首先,RSA算法的安全性是建立在大整数因子分解的困难性之上的。
选取整数 n = p q n=pq n=pq,消息空间与签名空间均为整数空间,即 M = A = Z n M=A=Z_n M=A=Zn,定义秘钥集合 K = { ( n , e ) , ( p , q , d ) ∣ n = p d , d × e ≡ 1 m o d ϕ ( n ) } K=\{ (n,e),(p,q,d)|n=pd,d\times e \equiv 1mod \phi(n)\} K={(n,e),(p,q,d)∣n=pd,d×e≡1modϕ(n)}。
对 x ∈ M x \in M x∈M,Bob要对 x x x签名,取 k ∈ K k \in K k∈K, s i g k ( x ) = x d m o d n = y sig_k(x)=x^dmodn=y sigk(x)=xdmodn=y,于是验证等式 x = y e m o d n x=y^emodn x=yemodn是否成立。
系统中有 l l l个参与者,编号分别为 1 , . . . , l 1,...,l 1,...,l,有一个可信的dealer和一个敌手adversary。dealer选择两个长度(512bit)相等的素数 p p p和 q q q,设 p = 2 p ′ + 1 , q = 2 q ′ + 1 p=2p'+1,q=2q'+1 p=2p′+1,q=2q′+1,其中 p ′ , q ′ p',q' p′,q′也都是素数。RSA模 n = p q n=pq n=pq,令 m = p ′ q ′ m=p'q' m=p′q′,并选择公共一个素数指数 e , e > l e,e>l e,e>l。
此时,RSA公钥为 P K = ( n , e ) PK=(n,e) PK=(n,e)。
接下来,dealer选择 d , d ∈ Z d,d \in Z d,d∈Z,满足 d e ≡ 1 m o d m de\equiv 1modm de≡1modm,即 d d d就是要分享的秘密值。设置 a 0 = d a_0=d a0=d,dealer随机的选择 a i , a i ∈ 0 , . . . , m − 1 , 1 ≤ i ≤ k − 1 , k a_i,a_i \in {0,...,m-1},1 \leq i \leq k-1,k ai,ai∈0,...,m−1,1≤i≤k−1,k为门限值。即构成的关于 k − 1 k-1 k−1次多项式为 f ( X ) = ∑ i = 0 k − 1 a i X i f(X)=\sum_{i=0}^{k-1}{a_iX^i} f(X)=∑i=0k−1aiXi。
对于 1 ≤ i ≤ l 1 \leq i \leq l 1≤i≤l,计算分享的密钥值 s i : s i = f ( i ) m o d m s_i:s_i=f(i)modm si:si=f(i)modm。 s i s_i si就是对于参与者 i i i的私钥 S K i SK_i SKi。
接下来,计算 verification keys,用于验证签名的是否有效。dealer选择一个随机值 v ∈ Q n v \in Q_n v∈Qn,并计算 v i = v s i ∈ Q n , 1 ≤ i ≤ l v_i = v^{s_i} \in Q_n,1 \leq i \leq l vi=vsi∈Qn,1≤i≤l,令 V K = v , V K i = v i VK=v,VK_i=v_i VK=v,VKi=vi。
接下来,计算拉格朗日系数。令 δ = l ! \delta = l! δ=l!,对于集合大小为 k k k的子集 S S S,其中元素均属于 0 , . . . , l {0,...,l} 0,...,l,对于任何 i ∈ 0 , . . . , l \ S , j ∈ S i \in {0,...,l \backslash S},j \in S i∈0,...,l\S,j∈S,定义:
λ i , j S = δ ∏ j ′ ∈ S \ j ( i − j ′ ) ∏ j ′ ∈ S \ j ( j − j ′ ) \lambda_{i,j}^S=\delta \frac{\prod_{j' \in {S \backslash{j}}}(i-j')} {\prod_{j' \in {S \backslash{j}}}(j-j')} λi,jS=δ∏j′∈S\j(j−j′)∏j′∈S\j(i−j′)
这些值是标准拉格朗日插值公式系数。从拉格朗日插值公式可得:
δ ⋅ f ( i ) ≡ ∑ j ∈ S λ i , j S f ( j ) m o d m \delta \cdot f(i) \equiv \sum_{j \in S} \lambda_{i,j}^S f(j)modm δ⋅f(i)≡j∈S∑λi,jSf(j)modm
下面,计算一个关于消息 M M M的一个签名份额:令 x = H ( M ) x=H(M) x=H(M),对于参与者 i i i计算 x i = x 2 δ s i ∈ Q n x_i=x^{2\delta s_i} \in Q_n xi=x2δsi∈Qn, x i x_i xi是一个参与者 i i i的签名份额。
每个签名份额对于有一个正确性的证明,这个正确性证明仅对于基 x ~ = x 4 δ \tilde{x}=x^{4\delta} x~=x4δ的 x 2 x^2 x2离散对数与对于基 v v v的 v i v_i vi离散对数相似。
下面,计算每个签名份额的正确性证明以及如何验证这个签名份额: L ( n ) L(n) L(n)是 n n n的比特长度, H ′ H' H′是一个hash函数,函数输出一个 L 1 L_1 L1bit的整数,此处 L 1 = 128 L_1 = 128 L1=128是第二个安全参数。为了生成正确性证明,参与者选择随机数 r ∈ { 0 , . . . , 2 L ( n ) + 2 L 1 − 1 } r \in \{ 0,...,2^{L(n)+2L_1} -1 \} r∈{0,...,2L(n)+2L1−1},计算:
v ′ = v r , x ′ = x ~ r , c = H ′ ( v , x ~ , v i , x i 2 , v ′ , x ′ ) , z = s i + r v'=v^r,x'=\tilde{x}^r,c=H'(v,\tilde{x},v_i,x_i^2,v',x'),z=s_i+r v′=vr,x′=x~r,c=H′(v,x~,vi,xi2,v′,x′),z=si+r
此时,正确性证明就变成 ( z , c ) (z,c) (z,c)。为了验证这个证明,只需要检查下面等式是否成立:
c = H ′ ( v , x ~ , v i , x i 2 , v z v i − c , x ~ z x i − 2 c ) c=H'(v,\tilde{x},v_i,x_i^2,v^zv_i^{-c},\tilde{x}^zx_i^{-2c}) c=H′(v,x~,vi,xi2,vzvi−c,x~zxi−2c)
此处,计算的是 x i 2 x_i^2 xi2,而不是 x i x_i xi,原作者是这样解释的:Although x i x_i xi is supposed to be a square, this is not easily verified. This way, we are sure to be working in Q n Q_n Qn, where we need to be working to ensure soundness.
在组合所有签名份额之前,先要验证每一个签名份额,并且要满足有效的签名份额个数不能小于门限 k k k。
假设此处有一组有效的签名份额集合 S S S, S = { i 1 , . . . i k } ⊂ { 1 , . . . , l } S=\{i_1,...i_k\} \subset \{1,...,l\} S={i1,...ik}⊂{1,...,l}。令 x = H ( M ) ∈ Z n ∗ x=H(M) \in Z_n^\ast x=H(M)∈Zn∗,且假设 x i j 2 = x 4 δ s i j x_{i_j}^2=x^{4 \delta s_{i_j}} xij2=x4δsij。然后组合签名份额,计算:
w = x i 1 2 λ 0 , i 1 S . . . x i k 2 λ 0 , i k S w=x_{i_1}^{2 \lambda_{0,i_1}^S} ... x_{i_k}^{2 \lambda_{0,i_k}^S} w=xi12λ0,i1S...xik2λ0,ikS
此处的 λ \lambda λ就是2.3节中的 λ i , j S \lambda_{i,j}^S λi,jS。根据 δ ⋅ f ( i ) ≡ ∑ j ∈ S λ i , j S f ( j ) m o d m \delta \cdot f(i) \equiv \sum_{j \in S} \lambda_{i,j}^S f(j)modm δ⋅f(i)≡∑j∈Sλi,jSf(j)modm,可得 w e = x e ′ w^e=x^{e'} we=xe′,此处 e ′ = 4 δ 2 {e'=4 \delta^2} e′=4δ2。
因为 g c d ( e ′ , e ) = 1 gcd(e',e)=1 gcd(e′,e)=1,通过算法: y = w a x b y=w^ax^b y=waxb,即为组合后的签名结果。此处 a a a和 b b b均为整数,且满足 e ′ a + e b = 1 e'a+eb=1 e′a+eb=1,可以从 e ′ e' e′和 e e e上的扩展欧几里德算法得到,这样就很容易计算出满足 a a a和 b b b。
验证签名与RSA签名验证逻辑一样:计算 ψ = y e m o d n \psi = y^emodn ψ=yemodn,此处 y y y即为2.5节中组合后的签名结果。验证者,只需要验证 x = = ψ x == \psi x==ψ是否成立。
[1]http://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf