1 门限签名
门限签名是普通数字签名的一个重要分支,是门限秘密共享技术和数字签名的一种结合。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 个或更少的成员不能代表该群体进行签名,同时任何成员不能假冒其他成员进行签名。采用门限签名方式可以实现权力分配,避免滥用职权。
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
p 和
q
q
q ,二者保密。计算
n
=
p
q
n=pq
n = p q ,公开
n
n
n 。
ϕ
(
n
)
=
(
p
−
1
)
(
q
−
1
)
\phi(n) = (p-1)(q-1)
ϕ ( n ) = ( p − 1 ) ( q − 1 ) ,
ϕ
(
n
)
\phi(n)
ϕ ( n ) 保密,选择一个公开的随机数
e
(
0
<
e
<
ϕ
(
n
)
)
e(0< e < \phi(n))
e ( 0 < e < ϕ ( n ) ) ,满足
g
c
d
(
e
,
ϕ
(
n
)
)
=
1
gcd(e, \phi(n))=1
g c d ( e , ϕ ( n ) ) = 1 ,计算
d
=
e
−
1
m
o
d
ϕ
(
n
)
d=e^{-1}mod \phi(n)
d = e − 1 m o d ϕ ( n ) ,
d
d
d 保密。此时,公钥为
(
e
,
n
)
(e,n)
( e , n ) ,私钥为
(
d
,
n
)
或
(
d
,
p
,
q
)
(d,n)或(d,p,q)
( d , n ) 或 ( d , p , q ) 。
加密:加密结果
C
=
M
e
m
o
d
n
C=M^emodn
C = M e m o d n ,已知条件
M
<
n
M < n
M < n ,公钥
(
e
,
n
)
(e,n)
( e , n ) 。
解密:解密结果
M
=
C
d
m
o
d
n
M=C^dmodn
M = C d m o d n ,已知条件
C
C
C ,私钥
(
d
,
n
)
(d,n)
( d , n ) 。
2.1.2 RSA签名验签
选取整数
n
=
p
q
n=pq
n = p q ,消息空间与签名空间均为整数空间,即
M
=
A
=
Z
n
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)\}
K = { ( n , e ) , ( p , q , d ) ∣ n = p d , d × e ≡ 1 m o d ϕ ( 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
s i g k ( x ) = x d m o d n = y ,于是验证等式
x
=
y
e
m
o
d
n
x=y^emodn
x = y e m o d n 是否成立。
2.2 系统初始化
系统中有
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 = 2 p ′ + 1 , q = 2 q ′ + 1 ,其中
p
′
,
q
′
p',q'
p ′ , q ′ 也都是素数。RSA模
n
=
p
q
n=pq
n = p q ,令
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)
P K = ( n , e ) 。
2.3 密钥分享
接下来,dealer选择
d
,
d
∈
Z
d,d \in Z
d , d ∈ Z ,满足
d
e
≡
1
m
o
d
m
de\equiv 1modm
d e ≡ 1 m o d m ,即
d
d
d 就是要分享的秘密值。设置
a
0
=
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
a i , a i ∈ 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 = 0 k − 1 a i X i 。
对于
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
s i : s i = f ( i ) m o d m 。
s
i
s_i
s i 就是对于参与者
i
i
i 的私钥
S
K
i
SK_i
S K i 。
接下来,计算 verification keys,用于验证签名的是否有效。dealer选择一个随机值
v
∈
Q
n
v \in Q_n
v ∈ 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 i = v s i ∈ Q n , 1 ≤ i ≤ l ,令
V
K
=
v
,
V
K
i
=
v
i
VK=v,VK_i=v_i
V K = v , V K i = v i 。
接下来,计算拉格朗日系数。令
δ
=
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 , j S = δ ∏ 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 , j S f ( j ) m o d m
2.4 生成门限签名份额
下面,计算一个关于消息
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
x i = x 2 δ s i ∈ Q n ,
x
i
x_i
x i 是一个参与者
i
i
i 的签名份额。
每个签名份额对于有一个正确性的证明,这个正确性证明仅对于基
x
~
=
x
4
δ
\tilde{x}=x^{4\delta}
x ~ = x 4 δ 的
x
2
x^2
x 2 离散对数与对于基
v
v
v 的
v
i
v_i
v i 离散对数相似。
下面,计算每个签名份额的正确性证明以及如何验证这个签名份额:
L
(
n
)
L(n)
L ( n ) 是
n
n
n 的比特长度,
H
′
H'
H ′ 是一个hash函数,函数输出一个
L
1
L_1
L 1 bit的整数,此处
L
1
=
128
L_1 = 128
L 1 = 1 2 8 是第二个安全参数。为了生成正确性证明,参与者选择随机数
r
∈
{
0
,
.
.
.
,
2
L
(
n
)
+
2
L
1
−
1
}
r \in \{ 0,...,2^{L(n)+2L_1} -1 \}
r ∈ { 0 , . . . , 2 L ( n ) + 2 L 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
v ′ = v r , x ′ = x ~ r , c = H ′ ( v , x ~ , v i , x i 2 , v ′ , x ′ ) , z = s i + 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 ~ , v i , x i 2 , v z v i − c , x ~ z x i − 2 c )
此处,计算的是
x
i
2
x_i^2
x i 2 ,而不是
x
i
x_i
x i ,原作者是这样解释的:Although
x
i
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
Q n , where we need to be working to ensure soundness.
2.5 组合签名份额
在组合所有签名份额之前,先要验证每一个签名份额,并且要满足有效的签名份额个数不能小于门限
k
k
k 。
假设此处有一组有效的签名份额集合
S
S
S ,
S
=
{
i
1
,
.
.
.
i
k
}
⊂
{
1
,
.
.
.
,
l
}
S=\{i_1,...i_k\} \subset \{1,...,l\}
S = { i 1 , . . . i k } ⊂ { 1 , . . . , l } 。令
x
=
H
(
M
)
∈
Z
n
∗
x=H(M) \in Z_n^\ast
x = H ( M ) ∈ Z n ∗ ,且假设
x
i
j
2
=
x
4
δ
s
i
j
x_{i_j}^2=x^{4 \delta s_{i_j}}
x i j 2 = x 4 δ 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}
w = x i 1 2 λ 0 , i 1 S . . . x i k 2 λ 0 , i k S
此处的
λ
\lambda
λ 就是2.3节中的
λ
i
,
j
S
\lambda_{i,j}^S
λ 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
δ ⋅ f ( i ) ≡ ∑ j ∈ S λ i , j S f ( j ) m o d m ,可得
w
e
=
x
e
′
w^e=x^{e'}
w e = x e ′ ,此处
e
′
=
4
δ
2
{e'=4 \delta^2}
e ′ = 4 δ 2 。
因为
g
c
d
(
e
′
,
e
)
=
1
gcd(e',e)=1
g c d ( e ′ , e ) = 1 ,通过算法:
y
=
w
a
x
b
y=w^ax^b
y = w a x b ,即为组合后的签名结果。此处
a
a
a 和
b
b
b 均为整数,且满足
e
′
a
+
e
b
=
1
e'a+eb=1
e ′ a + e b = 1 ,可以从
e
′
e'
e ′ 和
e
e
e 上的扩展欧几里德算法 得到,这样就很容易计算出满足
a
a
a 和
b
b
b 。
2.6 签名验证
验证签名与RSA签名验证逻辑一样:计算
ψ
=
y
e
m
o
d
n
\psi = y^emodn
ψ = y e m o d n ,此处
y
y
y 即为2.5节中组合后的签名结果。验证者,只需要验证
x
=
=
ψ
x == \psi
x = = ψ 是否成立。
3 参考资料
[1]http://www.iacr.org/archive/eurocrypt2000/1807/18070209-new.pdf
本文首发公众号VenusBlockChain,VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。有兴趣的小伙伴们,欢迎关注。