数字签名方案-ElGamal、Schnorr数字签名方案
数字签名简介
特征
- 它必须能验证签名者、签名日期和时间
- 它必须能够认证被签的消息内容
- 签名应能由第三方仲裁,以解决争执
因此数字签名具有认证功能
- 攻击和伪造
- 唯密钥攻击
- 已知消息攻击
- 一般选择消息攻击
- 定向选择消息攻击
- 适应性选择消息攻击
- 完全破译
- 通用伪造
- 选择伪造
- 存在性伪造
- 数字签名需求
- 签名必须是与消息相关的二进制串
- 签名必须使用发送方某些独有的信息,以防伪造和否认
- 产生数字签名比较容易
- 识别和验证签名比较容易
- 伪造数字签名在计算机上是不行的。
- 保存数字签名的副本是可行
- 直接数字签名
直接数字签名指只涉及通信双方(发送方和接收方)的数字签名方案
ElGamal数字签名方案
基于离散对数求解的困难性,使用私钥进行加密,公钥进行解密
算法描述
- 生成密钥 KeyGen:
|p| = 1024, Zp* = , x ∈ Zp-1, y = g^x mod p
pk = (g, p, y)
sk = x - 签名 Sign
随机数 r ∈ Zp-1
S1 = g^r mod p
S2 = (m - x*S1)r^-1 mod (p-1)
签名对:(m, (S1, S2)) - 认证 Verify
验证等式 g^m = y^s1 * S1^S2 mod p 是否成立
(任何人都可以验证)
Schnorr数字签名方案
基于离散对数求解的困难性,将生成签名所需的消息计算量最小化
算法描述
- 生成密钥 KeyGen:
|p| = 1024
q: q|p-1, |q| = 160
g ∈ Zp*, g^q = 1 mod p
H:{0,1}* ->{0, 1}^160 (->公开的Hash函数)
y = g^-x mod p
x ∈ Zq*
pk = (p, q, g, y, H)
sk = x - 签名 Sign
随机数 r ∈ Zq*
H(m||g^r mod p) = e
s = (r + x*e) mod q
签名对:(m, (s, e)) - 认证 Verify
验证等式 e = H(m||g^s*y^e mod p) 是否成立
(任何人都可以验证)
对比ElGamal和Schnorr
- 安全性:Schnorr的安全性小于ElGamal(更容易找到x)
- 时间效率上:Schnorr耗费的时间更少
- 空间效率上:Schnorr耗费的空间更少
用RSA产生数字签名方案
用发送方的私钥将该Hash码加密形成签名,然后发送消息及其签名。接收方收到消息,计算Hash码,接收方用发送方的公钥对签名解密,如果计算出Hash码与解密出的结果相同,则认为签名是有效的。因为只有发送方拥有私钥,所以只有发送方能够产生有效的签名。