六 数字签名 - 消息到底是谁写的

在这里插入图片描述
从上一篇文章里面我们知道,消息认证码可以识别篡改或者发送者身份是否被伪装,也就是验证消息的完整性,还可以对消息进行认证。但是消息认证码的缺陷就在于它的共享密钥上面。由于双方都有共享秘钥,第三方无法确认是哪一方发出,导致无法防止抵赖。

数字签名就是为了解决抵赖的问题的。解决的方法是使用公钥密码,用私钥加密相当于生成签名,用公钥解密相当于验证签名。

公钥密码与数字签名

如下图对照公钥密码和数字签名的过程:

  • 公钥密码
  • 数字签名

数字签名的方法

  • 直接对消息签名的方法
  • 对消息的散列值签名的方法

直接对消息签名的方法

对消息的散列值签名的方法


由于公钥加密的速度,一般使用对消息的散列值签名的方法,因为消息的散列值长度短并且固定。

数字签名的应用实例

信息安全公告

信息安全组织会在网站上发布一些关于安全漏洞的警告。由于这些信息需要被更多的人知道,所以没有必要对消息进行加密。但是需要防止有人伪装该组织发布虚假信息,这个时候只需要加上数字签名即可。这种对明文消息所施加的签名,一般称为明文签名(clearsign)

软件下载

为了保证下载软件的安全,不是恶意的病毒,软件作者会对软件加上数字签名。用户在下载完成以后,验证数字签名就能识别出下载的是不是被篡改过的软件。

公钥证书

验证数字签名的时候需要合法的公钥,但是如何才能知道自己拿到的公钥是合法的呢?这个时候就需要把公钥作为信息,对它加上数字签名,得到公钥证书。关于证书的问题再下一篇文章里面详细分析。

SSL/TLS

SSL/TLS 在认证服务器身份的时候会使用服务器证书,服务器证书就是加上了数字签名的服务器公钥。

数字签名的实现方式

RSA

  1. 用RSA生成签名
签名 = 消息^D mod N (用 RSA 生成签名)    

上面的 D 和 N 就是签名者的私钥。签名就是对消息的 D 次方求 mod N 的结果。

  1. 用RSA验证签名
由签名求得的消息 = 签名^E mod N (用 RSA 验证签名)

上面的 E 和 N 就是签名者的公钥。验证者计算签名的 E 次方并求 mod N,得到“由签名求得的消息”。将这个消息和发送者直接发过来的消息进行对比,如果一致就验证成功,不一致就验证失败。

ElGamal方式

EIGamal 方式是由 Taher ElGamal 设计的公钥算法,利用了在 mod N 中求离散对数的困难度。ElGamal 方式可以被用于公钥密码和数字签名。

DSA

DSA(Digital Signature Algorithm)是一种数字签名的算法。是由 NIST(National Institute of Standards and Technology,美国国家标准技术研究所)于 1991 年制定的数字签名规范(Digital Signature Standard,DSS)。DSA 是 Schnorr 算法和 ElGamal 方式的变体,只能用于数字签名,不能进行加密解密。

和 DH 算法类似,DSA 算法主要了解的也是其参数。通过参数文件生成密钥对。p、q、g 是公共参数,通过参数会生成密钥对,DSA 的公共参数和 DH 的公共参数很像,通过公共参数能够生成无数个密钥对,这是一个很重要的特性。

p 是一个很大的质数,这个值的长度建议大于等于 1024 比特(必须是 64 比特的倍数),p-1 必须是 q 的倍数,q 的长度必须是 160 比特。而 g 是一个数学表达式的结果,数值来自 p 和 q。

DSA算法中应用了下述参数:

p:L 比特长的素数。L 是 64 的倍数,范围是 512 到 1024;
q:p – 1 的 160 比特的素因子;
g:g = h^((p-1)/q) mod p,h 满足 h < p – 1, h^((p-1)/q) mod p > 1;
x:x < q,x 为私钥;
y:y = g^x mod p ,( p, q, g, y )为公钥;
H( x ):One-Way Hash函数。DSS 中 选用 SHA( Secure Hash Algorithm )。

DSA 的密钥对生成就取决于这三个公共参数 p、q、g。计算签名和验证签名也依赖参数文件。

ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)是一种利用椭圆曲线密码来实现的数字签名算法。

就像 DH 算法结合 ECC 一样,DSA 算法也能结合 ECC,称为 ECDSA 数字签名算法。相比 DSA 算法,ECDSA 算法安全性更高。

在 ECDSA 中,有三个参数很重要:

  • ECDSA 算法选择的命名曲线。
  • G,椭圆曲线的基点
  • n,相当于 G 基点的打点操作,n * G = 0

数字签名无法解决的问题

数字签名所用到的公钥密码中的公钥需要另外认证,防止中间人攻击。认证用于验证签名的公钥必须属于真正的发送者。

似乎陷入了一个死循环。数字签名用来识别消息篡改,伪装以及防止抵赖。但是我们又必须从没有被伪装的发送者得到没有被篡改的公钥才行。

为了验证得到的公钥是否合法,必须使用证书。证书是将公钥当做一条消息,由一个可信的第三方对其签名后所得到的公钥。

参考资料

该系列的主要内容来自《图解密码技术第三版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章