密码技术(九、一)之数字签名

数字签名

   ——消息到底是谁写的

数字签名

从消息认证码到数字签名

  • 消息认证码的局限性
     通过前面介绍的消息认证码,我们尅识别消息是否被篡改或者发送者身份是否被伪装,也就是可以校验消息的完整性,还可以对消息进行认证。然而,消息认证码是无法防止否认
     消息认证码值之所以无法防止否认,是因为消息认证码需要在发送者和接收者两者之间共享同一个密钥。因为密钥是共享的,所以能够使用消息认证码计算出正确的MAC值并不只有发送者,接收者也可以计算出正确的MAC值。由于双方都能计算出正确的MAC值,因此对于第三方来说,我们是无法证明这条消息的确是由发送者生成的。
  • 通过数字签名解决问题
     我们假设发送者使用密钥是一个只有自己才知道的私钥。当发送者发送消息时,用私钥生成一个“签名”。相对地,接收者则使用一个和发送者不同的密钥对签名进行验证。接收者的密钥无法根据消息生成签名,却可以对签名进行验证,也就是说可以知道这个签名是由发送者的密钥计算出来的。这就是数字签名

签名的生成和验证

 在数字签名技术中,出现了下面的两种行为。

  • 生成消息签名的行为
  • 验证消息签名的行为

生成消息签名 这一行为是由消息的发送者Alice来完成的,也称为“对消息签名”。生成签名就是根据消息内容计算数字签名的值,这个行为意味着“我认可该消息的内容”
验证数字签名 这一行为一般是由消息的接收者Bob来完成的,但也可以由验证消息的第三方来完成,这里的第三方在之前一直被命名为验证者Victor。验证签名就是检查该消息的签名是否真的属于Alice,验证的结果可以是成功或者失败,成功就意味着这个签名是否属于Alice的,失败则意味着这个签名不是属于Alice的。
 在数字签名中,生成签名和验证签名者两个行为需要使用各自专用高德密钥来完成。这不就是公钥密码么,在公钥密码中,密钥分为加密密钥和解密密钥,用加密密钥无法进行解密。此外,解密密钥只能由需要解密的人持有,而加密密钥则是任何需要加密的人都可以持有的。实际上,数字签名就是通过将公钥密码“反过来用”而实现的。

公钥密码与数字签名的密钥使用方式.png

公钥密码与数字签名

 先回顾一下前面说的公钥密码


密码技术(九、一)之数字签名_第1张图片
用公钥进行加密(公钥密码)x.png

  数字签名中也会使用到公钥和私钥,不过,这两个密钥多的用法和公钥密码是相反的,即用私钥加密相当于生成签名,而用公钥解密则相当于验证签名

密码技术(九、一)之数字签名_第2张图片
用私钥进行加密(数字签名).png

 用私钥进行加密这一行为只能由持有私钥的人完成,正事基于这一事实,我们才可以将用私钥加密的密文作为签名来对待。
 由于公钥是对外公开的,因此任何都能够用公钥进行解密,这就产生了一个很大的好处,即任何人都能对签名进行验证。
密码技术(九、一)之数字签名_第3张图片
公钥密码中,任何人都能进行加密(公钥密码).png

密码技术(九、一)之数字签名_第4张图片
数字签名中,任何人都能够验证签名(数字签名).png

数字签名的方法

 下面我们来介绍两种生成和验证数字签名的方法

  • 直接对消息签名的方法
  • 对消息的散列值签名的方法
     直接对消息签名的方法比较容易理解,但是在实际过程中,我们并不会使用;对消息散列值签名的方法,稍微复杂一点,但实际过程中,我们一般都是使用这种方法。

直接对消息签名的方法

密码技术(九、一)之数字签名_第5张图片
Alice对消息签名,Bob验证签名.png
  1. Alice用自己的私钥对消息进行加密
  2. Alice将消息和签名发送给Bob
  3. Bob用Alice的公钥对收到的签名进行解密
  4. Bob将签名解密后得到的消息与Alice直接发送的消息进行对比。

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

密码技术(九、一)之数字签名_第6张图片
Alice对消息的散列值签名,Bob验证签名.png
  1. Alice用单向散列函数计算的消息的散列值。
  2. Alice用自己的私钥对散列值进行加密。
  3. Alice将消息和签名发送给Bob。
  4. Bob用Alice的公钥对收到的签名进行解密。
  5. Bob将签名解密后得到的散列值与Alice直接发送的消息的散列值进行对比。


    密码技术(九、一)之数字签名_第7张图片
    Alice对消息的散列值签名,Bob验证签名(按时间顺序).png

对数字签名的疑问

疑问:
用私钥加密消息得到签名,然后再用公钥解密消息并验证签名,密文为什么能欧具备验证签名的意义呢?
解答:
虽然实际进行的处理内容是用私钥进行加密,但这里的加密并非是为了保证机密性而进行的。
数字签名时利用了“没有私钥的人事实上无法生成使用该私钥所生成的密文”这一性质来实现的。这里所生成的密文并非被用于保证机密性,而是被用于代表一种只有持有该密钥的人才能够生成的信息
这样的信息一般称为认证符号(authenticator),消息认证码也是认证符号的一种,数字签名也是一样的。数字签名时通过使用私钥进行加密来产生认证符号的。


疑问:
消息没有经过加密就发送了,这样不就无法保证消息的机密性了吗?
解答:
的确如此,数字签名的作用本来就不是保证机密性。
如果需要保证机密性,则可以不直接发送消息,而是将消息进行加密之后再发发送。


疑问:
数字签名只不过是计算机上一种数据,貌似很容被复制。但如果可以轻易复制出相同的内容,那还能用作签名吗?
解答:
虽然叫作签名,但它也仅仅是计算上的一种普通的数据而已。数字签名可以附加在消息的末尾,也可以和消息分离,单独作为文件来发送,但无论如何,我们都可以像复制普通文件一样,很容易的复制出任意个内容相同的副本。
但是,签名可以被复制,并不意味着签名就没有意义,因为签名所表达的意义是特定的签名者对特定的消息进行了签名,即便签名被复制,也不会改变签名者和消息的内容。
真正重要的是特定签名者与特定的消息绑定在了一起这一事实。


疑问:
数字签名只不过是普通的数据,消息和签名两者都是可以任意修改的,这样的签名还有意义吗?
解答:
的确,签名之后也可以对消息和签名进行修改,但是这样修改之后,验证签名就会失败,进行验证的人就能够发现这一修改行为。数字签名所要实现的并不是防止修改,而是识别修改。修改没问题,但验证签名会失败。
追问:
能不能同时修改消息和签名,是的验证签名能够成功呢?
解答:
事实上是做不到的。
以对散列值签名为例,只要消息被修改1个比特,重新计算的散列值都会发生很大的变化,要拼凑出合法的签名,必须在不知道私钥的前提下对新产生的散列值进行加密,事实上这是无法做到的,因为不知道私钥就无法生成用该私钥才能生成的密文。


疑问:
如果得到了某人的数字签名,应该就可以把签名的部分提取出来附加在别的消息后面,这样的还有效吗?
解答:
的确,可以将签名部分提取出来并附加到别的消息后面,但是严重签名会失败。总之,将一份签名附加在别的消息后面,验证签名就会事变。


疑问:
如果是纸质的借据,只要将原件撕毁就可以作废。但是带有数字签名的借据只是计算机文件,将其删除也无法保证确实已经作废,因为不知道其他地方是否还有副本。无法作废的签名是不是非常不方便呢?
解答:
的确,带有数字签名的借据即便删除掉也无法作废,要作废带有数字签名的借据,可以重新创建一份相当于收据的文书,并让对方在这份文书上加上数字签名。


疑问:
消息认证码无法防止否认,为什么数字签名就能够防止否认呢?
解答:
防止否认与“谁持有密钥”这一问题密切相关。
在消息认证码中,发送者和接收者都能够计算MAC值,相对地,在数字签名中,能够生成签名的密钥(私钥)只有发送者才持有,因此发送者没法说,“这个签名不是我生成的”,当然了,如果数字签名的发送者说“我的私钥被盗了”,也是有可能进行否认的。


疑问:
纸质借据如果不签名盖章的话,总是觉得不太放心。数字签名真的能够有效代替现实世界中的签名和盖章吗?
解答:
数字签名技术有很多优点,例如不需要物理交换文书就能够签订合同,以及可以对计算机的任意数据进行签名等。然后对于实际上能不能代替签名这个问题还是有一些不安的因素。其中一个很大的原因恐怕是签订合同、进行认证这样的行为是一种社会的行为。
数字签名技术在未来将发挥重要的作用,但是单词认为数字签名笔普通的印章或手印签名更可信是很危险的。一种新技术只有先被人民广泛认知,并对各种问题制定相应的解决办法只好,才能被社会真正接受。


该系列的主要内容来自《图解密码技术第三版》
我只是知识的搬运工
文章中的插图来源于原著

你可能感兴趣的:(密码技术(九、一)之数字签名)