基于RSA的实用门限签名算法

1 门限签名

门限签名是普通数字签名的一个重要分支,是门限秘密共享技术和数字签名的一种结合。1991年,Desmedt-Frankel首次提出了 ( t , n ) (t,n) 门限签名方案。 ( t , n ) (t,n) 门限签名方案是指由 n n 个成员组成一个签名群体,该群体有一对公钥和私钥,群体内大于等于 t t 个合法、诚实的成员组合可以代表群体用群私钥进行签名,任何人可利用该群体的公钥进行签名验证。这里 t t 是门限值,只有大于等于 t t 个合法成员才能代表群体进行签名,群体中任何 t 1 t-1 个或更少的成员不能代表该群体进行签名,同时任何成员不能假冒其他成员进行签名。采用门限签名方式可以实现权力分配,避免滥用职权。

2 基于RSA的门限签名

本算法[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.

算法整个流程:
在这里插入图片描述

2.1 RSA算法

2.1.1 RSA加解密

首先,RSA算法的安全性是建立在大整数因子分解的困难性之上的。

  • 秘钥生成:选择两个互异的大素数 p p q q ,二者保密。计算 n = p q n=pq ,公开 n n ϕ ( n ) = ( p 1 ) ( q 1 ) \phi(n) = (p-1)(q-1) ϕ ( n ) \phi(n) 保密,选择一个公开的随机数 e ( 0 < e < ϕ ( n ) ) e(0< e < \phi(n)) ,满足 g c d ( e , ϕ ( n ) ) = 1 gcd(e, \phi(n))=1 ,计算 d = e 1 m o d ϕ ( n ) d=e^{-1}mod \phi(n) d d 保密。此时,公钥为 ( e , n ) (e,n) ,私钥为 ( d , n ) ( d , p , q ) (d,n)或(d,p,q)
  • 加密:加密结果 C = M e m o d n C=M^emodn ,已知条件 M < n M < n ,公钥 ( e , n ) (e,n)
  • 解密:解密结果 M = C d m o d n M=C^dmodn ,已知条件 C C ,私钥 ( d , n ) (d,n)
2.1.2 RSA签名验签

选取整数 n = p q n=pq ,消息空间与签名空间均为整数空间,即 M = A = Z n M=A=Z_n ,定义秘钥集合 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)\}

x M x \in M ,Bob要对 x x 签名,取 k K k \in K s i g k ( x ) = x d m o d n = y sig_k(x)=x^dmodn=y ,于是验证等式 x = y e m o d n x=y^emodn 是否成立。

2.2 系统初始化

系统中有 l l 个参与者,编号分别为 1 , . . . , l 1,...,l ,有一个可信的dealer和一个敌手adversary。dealer选择两个长度(512bit)相等的素数 p p q q ,设 p = 2 p + 1 q = 2 q + 1 p=2p'+1,q=2q'+1 ,其中 p , q p',q' 也都是素数。RSA模 n = p q n=pq ,令 m = p q m=p'q' ,并选择公共一个素数指数 e e > l e,e>l

此时,RSA公钥为 P K = ( n , e ) PK=(n,e)

2.3 密钥分享

接下来,dealer选择 d d Z d,d \in Z ,满足 d e 1 m o d m de\equiv 1modm ,即 d d 就是要分享的秘密值。设置 a 0 = d a_0=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 为门限值。即构成的关于 k 1 k-1 次多项式为 f ( X ) = i = 0 k 1 a i X i f(X)=\sum_{i=0}^{k-1}{a_iX^i}

对于 1 i l 1 \leq i \leq l ,计算分享的密钥值 s i s i = f ( i ) m o d m s_i:s_i=f(i)modm s i s_i 就是对于参与者 i i 的私钥 S K i SK_i

接下来,计算 verification keys,用于验证签名的是否有效。dealer选择一个随机值 v Q n v \in Q_n ,并计算 v i = v s i Q n 1 i l v_i = v^{s_i} \in Q_n,1 \leq i \leq l ,令 V K = v , V K i = v i VK=v,VK_i=v_i

接下来,计算拉格朗日系数。令 δ = l ! \delta = l! ,对于集合大小为 k k 的子集 S S ,其中元素均属于 0 , . . . , l {0,...,l} ,对于任何 i 0 , . . . , l \ S , j S i \in {0,...,l \backslash S},j \in 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')}

这些值是标准拉格朗日插值公式系数。从拉格朗日插值公式可得:
δ 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

2.4 生成门限签名份额

下面,计算一个关于消息 M M 的一个签名份额:令 x = H ( M ) x=H(M) ,对于参与者 i i 计算 x i = x 2 δ s i Q n x_i=x^{2\delta s_i} \in Q_n x i x_i 是一个参与者 i i 的签名份额。

每个签名份额对于有一个正确性的证明,这个正确性证明仅对于基 x ~ = x 4 δ \tilde{x}=x^{4\delta} x 2 x^2 离散对数与对于基 v v v i v_i 离散对数相似。

下面,计算每个签名份额的正确性证明以及如何验证这个签名份额: L ( n ) L(n) n n 的比特长度, H H' 是一个hash函数,函数输出一个 L 1 L_1 bit的整数,此处 L 1 = 128 L_1 = 128 是第二个安全参数。为了生成正确性证明,参与者选择随机数 r { 0 , . . . , 2 L ( n ) + 2 L 1 1 } r \in \{ 0,...,2^{L(n)+2L_1} -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

此时,正确性证明就变成 ( 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})

此处,计算的是 x i 2 x_i^2 ,而不是 x i x_i ,原作者是这样解释的:Although x i x_i is supposed to be a square, this is not easily verified. This way, we are sure to be working in Q n Q_n , where we need to be working to ensure soundness.

2.5 组合签名份额

在组合所有签名份额之前,先要验证每一个签名份额,并且要满足有效的签名份额个数不能小于门限 k k

假设此处有一组有效的签名份额集合 S S S = { i 1 , . . . i k } { 1 , . . . , l } S=\{i_1,...i_k\} \subset \{1,...,l\} 。令 x = H ( M ) Z n x=H(M) \in Z_n^\ast ,且假设 x i j 2 = x 4 δ s i j x_{i_j}^2=x^{4 \delta s_{i_j}} 。然后组合签名份额,计算:
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}

此处的 λ \lambda 就是2.3节中的 λ i , j S \lambda_{i,j}^S 。根据 δ 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 ,可得 w e = x e w^e=x^{e'} ,此处 e = 4 δ 2 {e'=4 \delta^2}

因为 g c d ( e , e ) = 1 gcd(e',e)=1 ,通过算法: y = w a x b y=w^ax^b ,即为组合后的签名结果。此处 a a b b 均为整数,且满足 e a + e b = 1 e'a+eb=1 ,可以从 e e' e e 上的扩展欧几里德算法得到,这样就很容易计算出满足 a a b b

2.6 签名验证

验证签名与RSA签名验证逻辑一样:计算 ψ = y e m o d n \psi = y^emodn ,此处 y y 即为2.5节中组合后的签名结果。验证者,只需要验证 x = = ψ x == \psi 是否成立。

3 参考资料

[1]http://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf

本文首发公众号VenusBlockChain,VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们,欢迎关注。
在这里插入图片描述

发布了116 篇原创文章 · 获赞 282 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/jingzi123456789/article/details/105688273