数字签名介绍
数字签名,又称公钥数字签名,是指只有信息发送者才能产生的别人无法伪造的一串数字串,这段数字串是对信息发送者真实性的一个有效证明。数字签名类似于现实世界的盖章,签字功能,数字签名可以实现以下功能:
- 报文鉴别:用于证明信息来源
- 防止抵赖:防止发送者否认信息
- 防止伪造:防止非发送者伪造签名
数字签名的应用场景:
- 安全信息公告:确保公告的来源
- 软件下载:软件下载放病毒
- 公钥整数:对公钥签名,确保公钥合法与来源正确
- SSL/TLS:服务器认证
之前的文章介绍过消息认证码,可以用消息认证码识别出消息是否被篡改或者验证发送者身份,但是在部分高可信确认的场景中,无法使用消息认证码,因为消息认证码无法防否认。消息认证码无法防止否认的原因在于,发送者和接收者双方使用的是共享密钥,使用共享密钥,所以当密钥被窃取,其他人也就可以生成消息确认码,无法鉴别信息来源。
在之前的文章中,介绍过公钥密码技术,可以不使用共享密钥,使用私钥进行签名生成,使用公钥进行签名验证,这样就可以识别篡改、伪装还有防否认就可以实现了,这种技术就是数字签名。
数字签名方法
数字签名技术分为两部分
- 生成消息签名,由发送者操作
- 验证消息签名,由接收者操作
数字签名的流程如下图所示:
与公钥密码使用公钥加密消息,私钥密码解密消息刚好相反,数字签名是私钥密码生成签名,公钥密码验证签名,目的是在数字签名的应用场景中,是希望发送者进行签名,任何接收者都可以验证签名。
直接对消息进行签名
直接对消息进行签名可以参考下图流程
发送者将消息和使用消息生成的签名都发送给接收者,接收者使用签名解密出消息,再和收到的消息进行对比,确认消息的完成性与是否进行篡改。
这种方法的缺点就在于,需要对整个消息进行公钥加密,因为公钥加密算法非常慢,所以这个步骤会非常耗时,为了提高计算速率,则引入了单向散列函数。
对消息散列值进行签名
对消息散列值进行签名的流程如下图所示:
通过引入单向散列函数,将无论多长的消息先求出一个固定长度的散列值,再对散列值使用公钥密码算法处理,这样效率就会非常高。
数字签名是一种认证符号,虽然使用密文发送,但是密文并不是机密性的体现,而是只是为了让具有私钥的人加密,有公钥的人可以解密这一认证机制而设计的,只是一种认证符号。
数字签名算法中,消息是明文发送的,数字签名并不是用来保护消息机密性的,而是用来确保消息来源的算法。如果有机密性需求,则可以配合之前的加解密算法,对消息进行处理。
数字签名和现实签名一样,是可以被复制的,数字签名的特性是针对特定消息的签名,需要绑定发送,并不是所有的签名都是一样的
数字签名实现
基于RSA实现数字签名
RSA算法在公钥密码的文章中详细进行了描述,下图只展示一下算法简析,具体内容可以查看之前文章。
RSA应用在数字签名中,先生成秘钥对,然后发送者使用私钥对消息内容(这个消息内容,不一定是指原消息,也可以针对原消息经过单向散列函数处理后得到散列值)进行签名:
其中D和N是签名者的私钥,签名是对消息D次方求mod N的结果,得到签名后将消息和签名发送给接收者即可。
接收者收到后对签名按照下列公式处理:
其中E和N是接收者的公钥,对接收到的签名的E次方就mod N求得接受的消息,再将求得的消息和接收到消息进行对比,判断签名是否验证成功。
基于ElGamal实现数字签名
ElGamal方式是Taher ElGamal设计的公钥算法,利用在mod N中求离散数对的困难度,ElGamal方式可以被用于公钥密码和数字签名。
基于DSA实现数字签名
DSA,Digital Signature Algorithm,由美国国家标准技术研究所提出的数字签名规范,DSA是Schnors算法与ElGammal方式的变体,只能用于数字签名。
基于ECDSA实现数字签名
ECDSA,Elliptic Curve Digital Signature Algorithn,是一种利用椭圆曲线来实现数字的签名算法,椭圆曲线算法之前已有介绍。
基于Rabin实现数字签名
Rabin方式,是M.O.Rabin设计的公钥算法,利用mod N中求平方根的困难度,Rabin方式可以被用于公钥密码和数字签名