一、数字签名
1.从消息认证码到数字签名
(1)消息认证码的局限性
消息认证码可以用于验证消息的完整性,还可以对消息进行认证。在消息认证码中,需要发送者和接收者之间共享一个密钥,无法向第三方证明消息到底由谁生成,所以存在事后否认的可能。
(2)通过数字签名解决问题
假设发送者有一个只有自己知道的私钥,当发送者发送消息时,她用私钥生成一个“签名”。相对地,接收者则使用一个和发送者不同的密钥对签名进行验证。使用接收者的密钥无法根据消息生成签名,但是用接收者的密钥却可以对发送者所计算的签名进行验证,也就是说可以知道这个签名是否是通过发送者的密钥计算出来的。这就是数字签名。
2.签名的生成的验证
在数字签名中,通常存在两种行为:生成数字签名的行为和验证数字签名的行为。生成数字签名这一行为通常由发送者完成,这一行为也称为“对消息签名”。验证数字签名这一行为通常由接收者完成,但也可以由验证消息的第三方验证者Victor完成,验证签名也就是验证生成数字签名的是否真的为发送者,如果验证结果为真,则表明验证通过,数字签名生效。在数字签名中,生成签名和验证签名这两个行为需要使用各自专用的密钥来完成。发送者使用“签名密钥”来生成消息的签名,而接收者和 验证者则使用“验证密钥”来验证消息的签名。数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法生成签名的。此外,签名密钥只能由签名的人持有,而验证密钥则是任何需要验证签名的人都可以持有。公钥密码和上面讲的数字签名的结构非常相似,实际上,数字签名就是通过公钥密码反过来使用而实现的,具体密钥使用方式如下表所示。
私钥 | 公钥 | |
---|---|---|
公钥密码 | 接收者解密时使用 | 发送者加密时使用 |
数字签名 | 签名者生成签名时使用 | 验证者验证签名时使用 |
谁持有密钥? | 个人持有 | 只要需要,任何人都可以持有 |
二、数字签名的方法
1.直接对消息签名的方法
发送者要对消息进行签名,则需要发送者事先生成一对包含公钥和私钥密钥对,而需要验证签名的接收者则只需要拥有公钥即可。这种方法的签名和验证的过程如下图所示。
(1)发送者使用自己的私钥对消息进行加密操作;
(2)发送者将消息和数字签名发送给接收者;
(3)接收者使用发送者的公钥对收到的签名解密;
(4)接收者将签名解密后得到的消息与发送者直接发送的消息进行对比,如果二者一致,则签名验证成功。
2.对消息的散列值签名的方法
(1)发送者使用单项散列函数计算出消息的散列值;
(2)发送者使用自己的私钥对消息进行加密操作;
(3)发送者将消息和数字签名发送给接收者;
(4)接收者使用发送者的公钥对收到的签名解密;
(5)接收者将签名解密后得到的消息与发送者直接发送的消息进行对比,如果二者一致,则签名验证成功。
三、数字签名的应用实例
1.安全信息公告
信息发布的目的是尽量让更多的人知道,因此我们没有必要对消息进行加密,但是必须排除有人恶意伪装成该组织来发布假消息的风险。因此,我们不加密消息,而只是对消息加上数字签名,这种对明文消息所施加的签名、一般称为明文签名。
2.软件下载
日常生活中,我们需要判断所下载的软件是否可以安全运行,因为下载的软件有可能被主动攻击者Mallory篡改,从而执行一些恶意的操作。为了防止出现这样的问题,软件的作者可以对软件加上数字签名,而我们只要在下载之后验证数字签名,就可以识别出软件是否遭到了主动攻击者Mallory的篡改。
3.公钥证书
为确认公钥合法性,我们可以将公钥当作消息,对它加上数字签名,像这样对公钥施加数字签名所得到的就是公钥证书。
四、通过RSA实现数字签名
在RSA中,被签名的消息、密钥以及最终生成的签名都是以数字形式表示的。在对文本进行签名时,需要事先将文本编码成数字。用RSA生成签名的过程和验证过程整理如下表所示。
私钥 | 数D和数N |
---|---|
公钥 | 数E和数N |
生成签名 | 签名 = 消息D mod N |
验证签名 | 消息 = 签名E mod N |
五、对数字签名的攻击
1.中间人攻击
对数字签名的中间人攻击,具体来说就是主动攻击者Mallory介入发送者和接收者的中间,对发送者伪装成接收者,对接收者伪装成发送者,从而能够在无需破解数字签名算法的前提下完成攻击。
2.对单向散列函数的攻击
3.利用数字签名攻击公钥密码
绝不能对意思不清楚的消息进行数字签名。
4.潜在伪造
5.其他攻击
暴力破解找出私钥或者尝试对RSA的N进行质因数分解等。
小测验
1.公钥与私钥的作用
(1)Alice要生成一段消息的数字签名,需要使用Alice的公钥还是私钥呢?
(2)如果要验证Alice的签名,需要使用Alice的公钥还是私钥呢?
我的回答:(1)Alice要生成一段消息的数字签名,需要使用Alice的私钥;
(2)如果要验证Alice的签名,需要使用Alice的公钥。
2.数字签名的基础知识
下列说法中,请在正确的旁边画○,错误的旁边画×。
(1)要验证数字签名,需要使用签名者的私钥。
(2) RSA 可以用作数字签名算法。
(3)使用数字签名可以保护消息的机密性,不用担心被窃听。
我的回答:(1)×;(2)○;(3)×;
(1)要验证数字签名,需要使用签名者的公钥,私钥由签名者自行保管;
(3)使用数字签名不可以保护消息的机密性。