13.数字签名
- 概述数字签名过程:
- 密钥生成。
- 加密(签名生成):先哈希函数,结果 S S S 和私钥放入数字签名算法,然后给消息加后缀。
- 解密(验证签名):先哈希函数,将哈希值、 S S S、公钥 放入数字签名算法,得出来判断。
- 理解ElGamal数字签名方案:
- 安全性基于离散对数困难问题。
- 理解Schnorr数字签名方案:
- 安全性基于离散对数困难问题。
- 算法相对简单。
- 生成签名工作不依赖消息。
- 理解NIST数字签名方案:
- 核心是DSA数字签名算法。
- 先哈希计算,私钥签名,公钥验证。
- 安全、高效。
- 比较三者异同:
- ElGamal 和Schnorr都是基于离散对数问题,NIST基于椭圆曲线算法。
- Schnorr算法签名过程简洁,性能高。
- NIST安全性最高,Schnorr安全性次之,ElGamal的安全性依赖于随机位生成器。
- ElGamal 和Schnorr适用于加密协议和数字签名,NIST还被用于密码学应用中。
- 理解椭圆曲线数字签名方案:
- 基于椭圆曲线上的困难问题。
- 以更短的密钥长度保证相同的安全性。
- 理解RSA-PSS数字签名方案:
- 基于RSA数字签名方式,增加盐值 和填充机制。
- 克服了传统RSA算法的安全性问题,提高了数字签名的安全性。
13.1 数字签名概述
保证完整性和身份验证。
数字签名过程:
- 加密:
- 用哈希函数加密消息 M M M。
- 将加密结果与Bob的私钥作为算法输入。
- 得出结果 S S S 放在 M M M 之后,组成签名消息。
- 解密:
- 计算消息的哈希值。
- 将哈希值、 S S S、公钥 放入数字签名算法。
- 根据结果判断签名有效性。
性质:(认证功能体现)
- 能够验证签名者、签名日期和时间。
- 能够认证消息内容。
- 签名应由第三方仲裁。
13.2 ElGamal数字签名算法
地位仅次于RSA。
建立在离散对数的困难问题基础上。
算法过程:
选取素数 q q q .
- 密钥产生:
- 选取小于 q q q 的两个随机数 α , X A \alpha ,X_{A} α,XA 。
- 计算 Y A = α X A m o d q Y_{A} = \alpha^{X_{A}} \mod q YA=αXAmodq
- 私钥: X A X_{A} XA 公钥: { q , α , Y A } \{q,\alpha,Y_{A}\} {q,α,YA}
- 加密过程:
- 选取与 $q -1 $ 互素的整数 K K K 。
- C 1 = α k m o d q C_1 = \alpha^k \mod q C1=αkmodq.
- C 2 = ( H ( m ) − x ∗ C 1 ) ∗ k − 1 m o d ( q − 1 ) C_2 = (H(m)-x*C_1) * k^{-1} \mod (q-1) C2=(H(m)−x∗C1)∗k−1mod(q−1).
- ( C 1 , C 2 ) (C_1,C_2) (C1,C2) 为签名, m m m 为消息。
- 验证过程:
- Y A C 1 ∗ C 1 C 2 = α H ( m ) m o d q Y_{A}^{C_1} * C_1^{C_2} = \alpha^{H(m)} \mod q YAC1∗C1C2=αH(m)modq
13.3 Schnorr数字签名算法
基于离散对数的困难问题。
算法过程:
-
密钥生成:
- 选取 p , q p,q p,q ,使得 q q q 是 p − 1 p-1 p−1 的一个素因子。
- 选择整数 a a a ,使得 a q ≡ 1 m o d p a^{q} \equiv 1 \mod p aq≡1modp 。
- 全局公钥: ( a , p , q ) (a,p,q) (a,p,q)
- 用户私钥:随机选择 S ∈ ( 0. q ) S \in (0.q) S∈(0.q)。
- 用户公钥: v = a − S m o d p v = a^{-S} \mod p v=a−Smodp 。
-
用户签名:
- 选择消息 r ∈ ( 0 , q ) r \in (0,q) r∈(0,q) , 生成 x = a r m o d p x = a^{r} \mod p x=armodp 。
- 用哈希函数计算 e = H ( M ∣ ∣ x ) e = H(M||x) e=H(M∣∣x) 。
- 计算 y = ( r + s e ) m o d q y = (r+se) \mod q y=(r+se)modq。
- 签名: ( e , y ) (e,y) (e,y) 。
-
验证:
- 计算 x ’ = a y v e m o d p x^{’} = a^{y}v^{e} \mod p x’=ayvemodp 。
- 验证 e = H ( M ∣ ∣ x ′ ) e = H(M||x^{'}) e=H(M∣∣x′) 。
13.4 NIST数字签名
13.4.1 DSA方法
安全性基于离散对数问题。
DSA签名方案的主要步骤如下:
- 用发送者的私钥生成签名:
- 随机选择一个数k,并计算 r = ( g k ( m o d p ) ) ( m o d q ) r=(g^k \pmod{p}) \pmod{q} r=(gk(modp))(modq),其中g是模p的一个原根,p和q是两个大质数。
- 计算 s = k − 1 ( H ( m ) + x r ) ( m o d q ) s = k^{-1}(H(m) + xr) \pmod{q} s=k−1(H(m)+xr)(modq),x是发送者的私钥。
- 签名为 ( r , s ) (r,s) (r,s)。
- 用发送者的公钥和签名验证消息:
- 计算 w = s − 1 ( m o d q ) w = s^{-1} \pmod{q} w=s−1(modq) 。
- 计算 u 1 = H ( m ) w ( m o d q ) u_1 = H(m)w \pmod{q} u1=H(m)w(modq) 和 u 2 = r w ( m o d q ) u_2 = rw \pmod{q} u2=rw(modq)。
- 验证签名:
- 计算 v = ( ( g u 1 x u 2 ( m o d p ) ) ( m o d q ) ) v = ((g^{u_1}x^{u_2} \pmod{p}) \pmod{q}) v=((gu1xu2(modp))(modq))。
- 如果 v = r v = r v=r,则消息m是合法的。
w \pmod{q}$ 和 u 2 = r w ( m o d q ) u_2 = rw \pmod{q} u2=rw(modq)。
- 验证签名:
- 计算 v = ( ( g u 1 x u 2 ( m o d p ) ) ( m o d q ) ) v = ((g^{u_1}x^{u_2} \pmod{p}) \pmod{q}) v=((gu1xu2(modp))(modq))。
- 如果 v = r v = r v=r,则消息m是合法的。