1、Schnorr签名
Schnorr签名点乘形式
(1)交互式
![](https://img-blog.csdnimg.cn/direct/3a77d17d0d6146e9b84bf38637171219.png#pic_center)
(2)非交互式:关键在于产生R之前无法让Alice预测到c的值。
![](https://img-blog.csdnimg.cn/direct/98e0ea466b5d42a69e3ab960af100816.png#pic_center)
Schnorr签名指数形式: 参考《现代密码学(第4版) 》第190页
![](https://img-blog.csdnimg.cn/direct/fad41b8fcd3e46aaa239b42d72a08e56.jpeg#pic_center)
![](https://img-blog.csdnimg.cn/direct/2454cc3f7ea74209b5a4933b3c25d90d.jpeg#pic_center)
注释1:
在椭圆曲线群上,最有效的已知算法是Pollard的rho算法,其时间复杂度大约为
O
(
n
)
O(\sqrt{n})
O(n),其中n是椭圆曲线上群的阶(通常与曲线的基点的阶大致相同)。因此,如果椭圆曲线群的阶为
n
n
n,破解ECDLP所需的时间复杂度大致为
n
\sqrt{n}
n。也就是说,160比特的ECC密钥提供了大约与80比特对称密钥相同的安全性。
注释2:
在非交互式Schnorr签名中用C替换R的原因:
① 发送
(
R
,
s
)
(R,s)
(R,s),由于
R
=
g
k
m
o
d
p
R = g^k ~mod ~ p
R=gk mod p,
R
R
R 是
Z
p
\mathbb{Z}_p
Zp的元素,如果
p 是一个512比特的素数, q 是一个160比特的素数,那么发送 (R,s) 需要512 + 160 = 672比特。
② 由 s = r + c ∗ p k s = r + c * pk s=r+c∗pk , r ∈ [ 1 , q − 1 ] r \in [1, q-1] r∈[1,q−1], p k ∈ [ 1 , q − 1 ] pk \in [1, q-1] pk∈[1,q−1] 可知 s ∈ [ 1 , q − 1 ] s \in [1,q-1] s∈[1,q−1],结合注释1的分析,160 比特椭圆曲线群的安全性只有 80比特。那么,挑战数 c也只需要80 比特就足够了发送 (c,s) 需要512 + 80 = 592比特。
注释3:
Fiat-Shamir 变换 可将双交互式协议转变为单交互式。通过将验证方的挑战值变换为发送方的随机值 + 哈希值。
2、 Elgamal签名
(1) 产生公私钥对:
- 生成大素数 p p p, p ≥ 2 1024 p \ge 2^{1024} p≥21024,生成有限域 Z p \mathbb{Z}_p Zp, g ∈ Z p ∗ g \in \mathbb{Z}_p^* g∈Zp∗是 Z p \mathbb{Z}_p Zp的生成元, 选择大素数q, q ∣ ( p − 1 ) , q ≥ 2 160 q | (p - 1), q \ge 2^{160} q∣(p−1),q≥2160,
- 选择 x ← R Z p ∗ x \overset{R}{\leftarrow} \mathbb{Z}_p^* x←RZp∗, y = g x m o d p y = g^x ~mod~ p y=gx mod p
- 私钥为 x x x, 公钥为 ( y , g , p ) (y,g,p) (y,g,p)
(2)签名:
- 对消息 m m m 进行加密;
- 随机选择整数 k ← R Z p ∗ k \overset{R}{\leftarrow} \mathbb{Z}_p^* k←RZp∗
- 计算 r r r, r ≡ g k ( m o d p ) r \equiv g^k (mod ~p) r≡gk(mod p)
- 计算 s s s, s ≡ [ H ( m ) − x r ] k − 1 ( m o d ( p − 1 ) ) s \equiv [H(m) -xr] k^{-1} ~ (mod ~(p -1)) s≡[H(m)−xr]k−1 (mod (p−1))
(3)验签:
- 计算 g H ( m ) ′ g^{H(m)'} gH(m)′, g H ( m ) ′ = y r r s = ( g x ) r ( g k ) ( H ( m ) − x r ) / k g^{H(m)'} = y^r r^s = (g^x)^r (g^k)^{(H(m) - xr) / k} gH(m)′=yrrs=(gx)r(gk)(H(m)−xr)/k
- 验证 g H ( m ) ′ = ? g H ( m ) g^{H(m)'} \overset{?}{=} g^{H(m)} gH(m)′=?gH(m),若成立则为真,否则为假。
![](https://img-blog.csdnimg.cn/direct/8d6a960c9211410ca6ae0fc2eab16f4c.jpeg#pic_center)
(4)安全性分析
注释:
3、DSA签名
未完待续