《计算机系统与网络安全》第五章 消息认证与数字签名

news2024/11/16 17:28:01

在这里插入图片描述

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

  • 第五章 签名
    • 5.1消息认证的概述
    • 5.2 认证函数
      • 5.2.1 认证函数
      • 5.2.2哈希函数
      • 5.2.3哈希函数的构造
      • 5.2.4常用的哈希算法
      • 5.2.5哈希函数的基本用法
    • 5.3 数字签名
      • 5.3.1 数字签名概述
      • 5.3.2 数字签名的分类
      • 5.3.3 仲裁数字签名
      • 5.3.4 群数字签名
      • 5.3.5 盲数字签名
  • 原创声明

第五章 签名

5.1消息认证的概述

消息认证又叫报文认证,是消息的接收者验证消息的真实性和完整性的过程与技术。真实性就是验证消息发送者他是真实的而非假冒的。也就是说假如消息的发送者声称是张三,我们要验证一下这个张三他是否是真的张三,这个又叫做信源鉴别,就是信息的源头鉴别它的真伪。另外还要验证消息的完整性,就是验证消息在传送或者存储过程当中没有被篡改,存放、乱序或者延迟等攻击。这个消息认证是防止主动攻击的重要技术,这个主动攻击主要针对真实性和完整性进行攻击,主要包括假冒,假冒某个合法的实体发送一个消息。另外就是内容修改,对消息的内容进行篡改,包括插入、删除、转换或者修改。还有顺序的修改,对消息的顺序进行修改,因为消息往往可能有多个报文组成,这个时候对消息的顺序进行重新排列,也构成了攻击。即时修改是从时间的角度对消息进行延迟,影响消息的时效性,或者截获了消息之后重新来发送产生重放攻击。

消息认证的核心思路是什么样?从两个方面要保障真实性,可以使用数字签名,跟我们现实生活当中的签名是一样的。我们发送方在发送一个消息之前先对他做签名,然后再发送,接收方收到之后就可以凭借这个签名来验证这个消息的发送方它是否是真实的。采用数字签名除了能够保障真实性之外,还能够抗抵赖,因为这个签名签好之后,白纸黑字签字画押,它是不能抵赖的。还可以使用对称密码体制,我们使用对称密钥,假设发送方接收方分别是a和b他们共享了一个密钥k,如果接收方b收到了一个用k加密的密文,并且能够用这个 K来正确的解密,这个时候接收方b它就可以断定这个消息是来自于a的,因为除了它之外,只有a有这个密钥k它才能够产生这个密文。第二个方面保证完整性,保障这个完整性就是消息发送方假设他发送了一个消息m经过了网络的传输,有可能这个网络会造成一些差错,或者在传输过程当中受到了攻击。这个时候我们就把这个接收方收到的消息标记为m一撇,这个保障完整性就是接触方他去验证这个他接收到的消息m一撇与发送方发送的消息m它是否是一样的一致的。如果不一致的话,就说明这个网络可能产生了差错或者受到了攻击,如果一致的话就说明这个传输是没有问题的,消息是完整的。这个消息认证我们可以类比成快递和外卖,今天想必同学们都在使用快递或者点外卖,前段时间我看到过一些新闻报道,我们这个外卖员在运送外卖的时候,破坏了外卖的完整性,在传输过程当中把这个外卖打开了,然后做了一些这个品鉴工作。如何来保障这个外卖的真实性和完整性?从真实性的角度,外卖可以采用这个独特的包装,让这个伪造很困难或者说这个成本很高。比如说我们这个点的乡村鸡的外卖,它就采用乡村机自己独特的包装,让别的商家或者攻击者或者其他什么人难以去伪装他的这个包装,如何来保障这个外卖的完整性?同学们可以思考一下。

第一种方式,我觉得我们可以使用一个比较坚固的一个盒子,然后把这个外卖给封装起来,并且给它上一个锁。这个钥匙只有这个什么?呀商家和用户手里面有,商家把这个外卖封装在这个盒子里面之后,我们快递员在传输过程当中,它是没有办法打开这个盒子,然后做品鉴工作的。只有客户收到这个外卖之后,用他手里的钥匙把这个外卖打开才能够去品尝这个外卖。当然这种方式的话,它的最大缺点就是什么?呀这个成本太高了。

另外需要在商家和客户之间事先来传递这个钥匙,这个挺麻烦的。另外一种方式就是可以采用特征标签的方式,什么叫特征标签?大家在使用快递的时候,快递上面是不是都有一个清单?包裹上面有一个纸条,上面通常是一个表单,上面通常会写上这个快递的发件人收件人,还有就是这快递的一些特征,快递的什么东西,我们就可以采用这样的思路来保障我们消息的完整性。我们在发送消息之前,由发送方对消息产生一个标签,然后我们接收方接收到这个消息之后再去对这个接收到消息产生一个标签,然后这两个标签我们来做一个对比,我们就可以判定这个消息它是否是完整的。

回到我们外卖这个例子当中的话,我们使用特征标签,比如说我们这个有一个用户今天点的午饭是二两饺子,这个时候商家就可以事先对这个二两饺子做一个标签,进行特征标签,标注上这是一份饺子,总共有多少个?比如说是10个,然后我们再给它称一个比较精确的重量,它有多少克,然后这个时候就产生了一个标签,这个标签就记录上我们这个外卖这份饺子有多少个有多少克。这个时候我们快递员在运送过程当中,如果对它进行了品鉴的话,势必会影响这份饺子它的什么?它的数量和它的重量。

接收方接收到之后,然后就可以凭借这个标签来判定这个这一份的外卖有没有被外卖员给攻击,有没有破坏它的完整性。

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYq1IEQU-1687880835254)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

接下来我们来看一下消息认证的模型,我们消息认证的模型,大家看这样一个图,它类似于消息加密的模型,这里有信源、信速,信源要传送一个消息给信速,信宿它要验证这个消息的完整性,消息的真实性,这个时候就需要信源事先对这个消息做一个认证编码,产生一个标签,然后把这个标签附加在,消息的上面或者后面,通过公开信道进行传输,迅速收到了这个带有认证标签的信息之后,通过标签来进行一个密码工作,根据译码出来这个标签这个消息的特征信息,我们来验证消息它的真实性和完整性。通常这个消息的编码和消息的密码都需要借助密钥,都需要使用一个密钥k就需要有一个密钥圆,然后还需要有一个安全的信道来传输这个密钥。这个模型可以表达为一个三元组KTV,不是唱歌KTV,这k代表的是密钥生成算法, t代表的是标签算法,也就是认证编码器产生一个标签,v是验证算法,也就是我们这个模型当中认证密码器,要进行一个验证工作。

5.2 认证函数

我们刚才看到的消息认证模型当中的核心就是认证编码器和认证译码器,这两个东西我们把它抽象为认证函数,那么这个认证函数负责为发送方产生一个认证的标识或者标签,接收方凭借认证标识,完成对消息的鉴别和认证。这个产生标签以及凭借标签来进行我们消息的鉴别的过程,就是认证协议,它是一套规程。

认证函数分为三类,第一类是消息加密函数,就是用我们消息的密文作为我们消息的认证标签,我们把一个消息加密,产生密文,然后把这个密文作为消息认证的标签。

第二类就是消息认证码MAC,注意这个MAC不是我们讲网络当中的物理地址,那么这个消息认证码是对信源消息的一个编码函数,那么它通常凭借公开的呃函数或者公开的算法,然后和密钥结合产生一个固定长度的一个认证标签。

第三类是最常见的是散列函数,就通过散列函数又叫做数字指纹,然后产生一个固定长度的一个信息,或者说指纹,或者叫摘要,用这个固定长度的指纹或摘要作为我们消息认证的这个认证码,用我们这个固定长度的消息指纹或者摘要作为我们消息认证的标识。

5.2.1 认证函数

我们接下来看前两类认证函数,消息加密函数与认证码。

首先消息加密函数,消息加密函数是用消息自身的密文作为消息认证标签,这个要求消息的发送方和接收方,他们事先约定一个密钥,这个时候有了事先约定的共享密钥k之后,信源首先发送这个消息m加上它的密文,这个密文就是用密钥k来对明文m来做一个加密,然后把这个密文c作为消息的认证标签,迅速接收到消息以及它的密文。这里由于这个消息经过了网络传输,同样我们把这个消息经过网络传输之后标记为m‘,也就是说迅速接收到的是m’和这个密文c.这里为什么c是不变?因为只有发送方和接收方他们才有、这个密钥攻击者没有这个密钥,所以它不能对这个密文做修改,而且即便对密文做修改,由于它没有这个密钥,所以这个很容易被检测出来

通过用这个密文自身作为我们消息认证码,信宿怎么样来进行验证,信宿就可以把这个密文作为一个解密操作,就可以把它对应的明文给恢复出来,也就是说恢复出m,这个m是我们发送之前的消息,这个时候接收方手里面它就有m和m一撇,他就可以把这两个来作为一个比对,如果这两者它是一致的一样的,这个时候说明消息的传递过程当中没有发生攻击或者网络的差错,如果这两者不一样,说明存在攻击或者传输错误。

另外一种方法就是我们不用解密,用加密的操作,把接收到的消息m’做一个加密运算,产生一个c’,这个同样我们可以把这个 c’跟接触方收到的 c拿来做比对,如果是一样的,这名消息它是完整的,不一样则证明消息不完整。把消息的密文作为我们消息认证的标签,它的缺点也是很明显的。缺点是什么?就是我们这个认证标签通常与消息是等长的,因为采用加密的方式,通常这个密文与明文是等长的,也就是说消息如果是n位的话,它灭亡也是n位的。这个时候要进行消息认证的传输,除了传m还要传这个 C,本来应该只穿n位的消息,结果要穿什么?二n位的消息,也就是说本身消息m占了n位,现在还要穿它的密文又是n位,所以总共的传输开销是二n位,所以开销是倍增了。

接下来我们来看消息认证码,消息密码也需要借助共享密钥,假设通信双方共享了密钥k发送方使用密钥k生成一个固定大小的短数据块,然后将这个短数据块附加在我们消息的后面作为消息的认证标签,这个认证标签如何来产生?MAC=Ck(m)也就是说对消息m用密钥k来产生一个它的短的认证码,发送的时候,发送方将 m和这个附加的认证标签MAC一起发送给接收方。同样接收方收到消息标记为m’和附带的消息认证码MAC,这个时候我们接收方如何来进行验证?这个消息认证码它类似于加密函数,但是它是不可逆的,因为它有一个压缩的作用在里头,他把这个这个消息m把它压缩成了一个固定大小的数据块,所以它不具备可逆性,也就是说我们不能从这个 mac当中把这个消息m给恢复出来,如何来验证?这个时候接收方它可以用密钥k,用同样的函数来产生一个新的认证码,MAC’,然后将这个产生的MAC’与接收到的附加的这个消息认证码MAC这两个认证码来做一个比对。如果是相同的,说明这个消息传递过程当中它是完整的,如果不相同说明这个消息它的完整性受到了破坏,这里是MAC的基本用法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9HPgFm5-1687880835256)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)]

这有一张图,假设信源是Bob,信数是Alice,这个时候抱抱就产生了消息m然后并且用这个认证码的算法c在密钥的作用下面,我们产生了它的认证码,然后把这个认证码附加在这个消息的后面,一起传输给迅速Alice。我们爱丽丝收到这个附加的认证码的消息之后,首先把消息来用相同的方法,相同的密钥k来产生一个新的认证码,然后将这个新的认证码与消息附带的传输过来的认证码进行一个比对操作,根据比对的结果来判断消息它是否是完整的。

这个基本用法它只能提供认证的功能,它是不保密的,因为消息m它是明文传输的,如果我们既要实现这个认证,又需要保密的话,就需要在刚才那个过程当中,在后面再加一个加密过程,这个时候就需要双方有两个共享密钥,一个密钥,k一用来产生认证码,另外一个密钥k二就用来加密信息。这个过程前面的部分是一样的,信源bub产生了消息m之后,用CAy一产生它的认证码,然后把认证码附加在消息的后面,然后再用k二来对这个附加了认证码的消息做一个加密预算,然后把它发送给Alice。X收到之后,这个消息最后是经过加密的,所以它首先要用相同的密钥k二来做一个减运算,解密完了之后把这个消息当中的消息和认证码这两部分,分别分割开来,然后用这个消息m用k一来产生新的认证码,然后再把这个新产生的认证码跟我们消息附带传输过来的认证码做一个对比。这两个认证码,一个是消息传输之前产生的认证码,一个消息传输之后的认证码,两个认证码一比对,如果是相同的代表消息是完整的,如果它是不相同的,代表消息完整性受到了破坏,可能有网络传输的差错或者是攻击的存在。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zoTTwoYX-1687880835256)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg)]

这种用法提供了消息认证,又提供了消息的保密性,这种用法它是将认证码与明文进行连接的,也就是说我们对明文产生认证码,然后再附加在明文的后面,我们也可以将认证码跟密文进行连接,认证码跟密文进行连接又怎么来操作?这个图就是我们认证码与密文连接的用法,信源 Bob首先用这个 k二来对消息做一个加密,产生蜜丸,然后再用k一来对我们这个密文产生一个认证码,把这个产生的认证码跟我们密文附加在一起,然后这个时候再把这个附加了认证码的密文发送给接收方,接收方收到之后,先要用 k二来对这个密文做一个简明运算,然后再用k一对密文产生一个新的认证码,然后再把这个新产生认证码跟这个附带的认证码两个来进行一个比对。如果是相同的,就验证了消息是完整的,不相同的话就说明消息的完整性受到了破坏,这就是我们消息认证码与密文连接的用法。

我们再来讨论一下MAC消息认证码它的安全要求,这个MAC它使用了密钥,这个跟我们对称密码体制当中密钥的用法是一样的,这个密钥就很重要了,如果密钥泄露了或者被攻击了,MAC的安全性就无法保障了。假设攻击者也掌握了信源和信宿的密钥的话,它就可以什么?呀对消息进行一个篡改,或者直接伪造一个消息,然后用这个密钥来产生一个这个然后用这个他掌握的这个密钥k来产生一个针对这个伪造消息或者修改后消息匹配的一个认证码,然后发送给接收方信宿。这个时候由于这个攻击者它掌握了密钥,它生成的这个认证码跟我们篡改后的这个消息是匹配的,所以这种情况下面,迅速它就不能依据认证码来进行这个完整性的检验。

这里我们来看一下,使用我们前面介绍的DES算法如何来产生认证码,大家可以回忆一下我们前面讲的这个对称密码体制的加密模式,我们讲过有一种模式叫做密码块链模式,这个基于代式算法的消息认证码的产生,就是使用这个代式算法,采用密码快联模式来生成认证码的,它的具体过程就是把我们要产生认证码的消息分成若干个分组,第一第二到第n个,然后把这些分组分别输入DES算法来进行加密。首先是第一个分组来进行加密加密完产生的这个密文,产生的密文分组o1,然后把它与第二个分组第二来做一个e或运算进行这个连接,把这个抑或之后的结果再输入d s加密算法来进行加密,同样加密后的结果又与下一个分组来进行一个异或运算来进行连接,抑或的结果再来进行加密。如此反复迭代下去,直到最后一个分组加密完,最后一个分组加密完得到的密文分组就是认证码MAC由于这种密码块链模式,它就将这个药进行加密或者说药产生认证码的这个消息的所有的分组都串联起来了,所以最后一个分组它就包含了全部消息的内容在里头,所以最后一个分组就可以作为我们这个消息的认证码。这种方式产生的认证码,它只有一个密文的长度,也就是说可以把我们不管这个消息有多长,可以把这个不定长的任意长度的消息把它压缩成一个固定长度的一个消息认证码。

我们再来看一下消息认证码它的优缺点,它的优点是可以产生一个固定长度的一个短的消息认证标签,短的标签不增加额外的传输开销,就像快递一样,附加一个小的一个清单,并不会加大这个快递传输的这个开销。它也是有缺点的,缺点它就是它需要使用对称密钥。有没有不需要密钥就能生成固定长度的而且短的一个认证标签,这个方法就是哈希函数。

5.2.2哈希函数

哈希函数又叫散列函数、数字摘要、数字指纹或者杂凑函数,通常用这个 h来表示大h表示这个函数,小h表示哈希函数产生的结果也就是指纹,它是对任意长度的消息来做处理,采指纹,然后输出是一个固定长度的,而且很短的一个散列值,也就是我们一个很短的指纹。哈性函数它是一个单向的函数,所谓单向函数就是正向计算容易反向计算困难。

我们前面提到过,也就是说对一个消息,也就是说我们对一个消遣,我们产生它的指纹很容易,但是反过来要从这个指纹再把这个消息恢复出来,它是困难的,或者说不可行的,因为这个哈希函数它是一个压缩函数,他把任意长度的消息把它压成一个很短的一个数据块,压缩自然就存在这个信息的一个丢失,这个跟我们人的指纹是类似的,我们人可以很轻松的采集一个指纹出来,但是你要想从指纹把一个人给恢复出来,这个是不可行的很困难的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KZld4i4n-1687880835256)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg)]

这个哈希它具有这样特点就是说不同的消息它会有不同的指纹,跟我们人一样,不同的人有不同的指纹,这个时候我们就可以把这个指纹作为我们消息的标识,跟我们人的指纹一样,可以把指纹用来作为我们人的这个标识。这是因为我们这个哈希函数它是消息所有谓的一个函数,也就是说消息当中的任何一位或者多位的变化都会导致它的散裂指或者说指纹的变化。

接下来我们来看哈希函数的要求,我们刚才看到它是针对任意长度的数据块产生固定长度的,闪电词它是单向的,也就是说单项给任意一个m我们计算它的指纹容易,但是反过来给一个指纹h要把这个m找出来是不可行的。

哈希函数它的安全性是怎么样?从理论上来讲,哈希函数它是存在冲突的,而且冲突是一定存在的,但是他发现困难,为什么哈希函数从理论上来讲,它是一定存在冲突的?因为它的原理就是对任意长度的数据,我们把它映射到一个固定长度的散列值里面去,任意长度的数据它的这个空间是可以说是无穷大的,而我们固定长度的指纹,它的空间是有限的。比如说这个 MD5,它的指纹是512位的,它的空间就是2的512次方,这个虽然很大,但是它还是有限的,我们要把一个无限的空间当中的数据映射到一个有限的空间当中,势必会存在多个数据映射到统一一个散列值的情况。当多个数据映射到同一个散列值,这个时候就产生了碰撞,也就是说多个数据它们的指纹是相同的,如果类比我们人的指纹的话,就是多个人他的指纹是相同的,那这个时候这个指纹就产生了碰撞了,产生了碰撞就会带来一系列的安全问题。比如说我们日常生活当中我们用指纹来进行鉴别,我们来签字,那这个时候如果多个人的指纹是相同的,这个签字往往就是无效的,因为不能再用这个存在冲突的指纹来进行这个真实性的一个鉴别了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLf42m9q-1687880835257)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pLXteM7d-1687880835257)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]

既然哈希函数它的冲突一定是存在的,它还能用吗?他还能用这个哈希函数产生的指纹来对我们消息进行一个标识吗?是可以的,因为这个冲突存在,但是安全的哈希函数它的冲突是很难被发现的也就是说任意给另一个消息m一要找出另外一个跟它不相同的消息,m二,而且满足m1和m2它的指纹是相同的,这个在计算上面是不可行的,这个时候我们哈希函数它就是安全的,或者说我们可以任意的找一对消息,m一m二使他们的指纹是相同的,这在计算上是不可行的。

这两种情况下面,哈希函数都是安全的,我们都可以用这个哈希函数来进行我们消息的认证,产生消息认证码。这里我们来看一个简单的哈希算法,这个哈希算法对输入的消息序列以迭代的方式,每次处理一个分组,然后怎么样来处理,核心的处理操作就是一个易货操作。假设我们要处理的消息为m我们把它分成n个定长的分组,m1、m2、m3、m4直到mn然后这个时候我们就可以把这些消息连起来,迭代的取e或首先m11或m2,然后结果在进一步e或m3再来e或m4,再来e或m5,直到最后e或mn,由于这个抑或操作,所以这个消息的长度是不变的,也就是一个分组的长度。所以经过这一系列的易货操作之后,我们就得到了一个分组长度的最后的结果,最后这个疑惑的结果就可以作为我们这个消息的指纹,这个操作就可以作为一个简单的哈希算法。由于这个哈希的结果它是包含了,我们这个消息当中每一位的数据在里头,每一位都参与了一伙,所以它实际上是可以作为我们这个消息的指纹的。

我们再来看一下哈希函数的分类,我们可以从安全水平的角度把哈希函数分为弱无碰撞和强物碰撞,若无碰撞就是给另一个消息,小x它属于大x这个集合,在计算上面几乎找不到另外一个x一撇,使这个 x和x一撇它们的指纹相同,这个就是弱物碰撞,在计算上几乎找不到。

强物碰撞就是在计算上面几乎不可能找到不同的消息,它们具有相同的哈希,这里这个枪物碰撞它自然是包含肉碰撞的。

5.2.3哈希函数的构造

哈希函数的构造有几种思路,一种是基于数学难题,而基于数学难题,类似于我们前面讲的rac算法,它的计算速度慢不适用。第二种方法就是利用对称密码体制,采用类似的置换和代换的方法来产生哈希,也可以直接来设计。

我们来看一下哈希函数的一个通用结构,几乎现在所有的哈希函数都使用这样一个通用结构,这个结构首先会把原始药采集哈希的消息m分成固定长度的若干个分块,然后最后一块如果不足这个固定长度的话会把它进行填充,然后需要有一个初始的一个向量CV0,

然后核心是一个压缩函数f,f实现当前的这个向量跟我们当前的这个分组,然后作为输入产生一个输出cvi最后一个分组对应的这个输出就是哈希值。

这里是哈希函数通用结构的示意图,首先我们把药采集哈希的消息分为L个固定长度的分组,每个分组长度为b,然后需要有一个初始向量CV0,这个向量它的长度是为n位,这个时候我们就把这个初始向量与我们d零个分组,然后输入到压缩函数f当中,然后进行一个运算,这个运算得到结果,c飞机也是n位的,然后再把这个 Cv一跟我们第一个分组y一再作为输入输入到函数f当中去产生一个输出,CV2,这样一直迭代下去,到了最后一个分组,这个函数f就把这个 yl-1和这个cvl-1作为输入输入的函数当中产生一个n位的输出cvl,这个 cvl就是我们这个哈希它的结果,它产生的指纹。

5.2.4常用的哈希算法

接下来我们来介绍一下,常用的哈希算法主要由MD5,Sha,MD5,SHA。

我们来看MD5,Merkel在1989年提出了哈希function模型,然后我们rac算法作者当中的reversed于90年提出了MD4算法,然后在92年基于MD4算法的MD5纹丝,它的输入是512比特,也就是说它输入的数据分组的长度是512比特,然后产生的输出是128比特的这个指纹。MD5算法是2004年前最主要的哈希算法在国内外有着广泛的应用,曾一度被认为非常的安全。2004年发生了什么?我们下面会看,现在的美国的标准的Sha-1,它就是以MD5的前4MD4为基础来设计的。2004年国际密码学会议上面,当时还在山东大学的王晓云教授做了破译了MD5,哈佛128MD4 repair and repair gnd算法的报告,这个报告当中展示了他的最新研究成果,可以很快的找到MD5的碰撞,也就是说两个文件两个消息可以产生相同的MD5指纹,而且可以很快速的找到两个文件产生相同的指纹。这就意味着在网络上面电子签署的一份合同后,然后还可以找到另外一份具有相同签名,但是内容迥异的合同,这样两份合同它的真伪就无从辨别了,这就会产生混乱。这份研究报告宣告这个固若金汤的世界通行的密码标准,哈希算法 MD5它的堡垒轰然倒塌,引发了密码学界的轩然大波,这个研究成果也直接宣告MD5它的生命周期到此终止了。

接下来我们再来看Sha

Sha算法是由美国国家标准与技术研究院,nst和美国国家安全局 nsa设计它包括了5个算法,分别是Sha-1,-224-256-384和-512。后面4个算法有时候又并称为Sha-2。 Sha-1在许多的安全协议当中广为使用,比如说这个 tlssslpgp SS h sshipc等等,这个 Sha-1它是建立在MD四算法之上的,基本的框架都与MD4是类似的,它对长度小于2的64次方的输入产生长度为160比特的一个散列值,因此它这个抗穷举性更好。

5.2.5哈希函数的基本用法

下来我们来看哈希函数的基本用法,如何把它应用于消息认证?那么这里我们参考前面我们消息认证码的用法,我们看一下,同样信源信宿是bob和Alice,bob产生消息m,然后用哈希函数,然后对这个消息产生一个指纹,然后把这个指纹作为我们消息的认证码,附加在消息的后面发送给接收方Alice。那么Alice收到之后跟刚才相同的流程,针对消息产生一个新的指纹,用相同的哈希函数产生新的指纹,然后把新产生的指纹跟消息附带的指纹两个来做一个比对,用它来验证我们消息的完整性。

大家思考一下这个方法是否是可行的?这个方法是不可行的,会被攻击,因为哈希函数是不使用密钥的,且是一个公开的算法,所以攻击者可以采用相同的算法来对消息产生指纹。

图中这种用法我们攻击者就可以对消息做一个篡改,然后把这个篡改后的消息再计算一个指纹,把它附加在消息的后面,把这个篡改后的消息跟对应的指纹一起发送给接收方。接收方收到之后做验证的时候就会发现这个收到的消息的指纹跟这个附带的这个指纹是一致的,验证不出消息的完整性,那么这个就是这个方法存在的问题。

这有一个例子,假设攻击者对消息做了修改,把这个消息变成m1,攻击者用哈希算法对这个 m1取一个指纹,然后把它附加在m1的后面传送给接收方。这个时候接收方是可以通过验证的,从而没办法验证消息的完整性。刚才直接把消息的散列值指纹作为我们消息的认证码认证标签是不可行的。

我们就结合加密算法,我们来看一下如何来认证。同样信源信速分别是Bob和alice,那么bob产生消息m,然后取指纹,然后把这个指纹附加在消息的后面,作为认证码,然后再用一个共享密钥k加密这个消息,把这个加密后的消息发送给信宿爱丽丝,爱丽丝收到之后首先进行解密,用密钥k来解密,还原出消息和他附带的指纹,然后再对这个消息以及指纹来做一个完整性的验证,把这个消息做一个哈希运算得到一个新的指纹,跟消息本身携带的指纹来做一个比对,这种用法就可以保证完整性,接收方Alice它就可以验证消息是完整的,因为这个过程当中我们使用了密钥k对这个消息进行了加密,消息经过加密后,攻击者没有密钥则不能篡改消息。攻击者如果对这个传输的这个经过加密后的密文进行篡改的话,那么接收方爱丽丝收到这个消息并解密时,如果解密出的消息不具备可读性,则表明消息的完整性受到破坏,存在攻击。

刚才的用法既提供了消息认证,又提供了保密,那么这里我们还可以有另外一种用法,仅对消息的指纹来做加密。首先Bob产生消息,然后把这个消息来做一个指纹,作为一个哈希运算得到指纹,然后用密钥k来对这个指纹来加密,然后把这个加密的指纹附加在消息的后面,一起传输给信宿Alice。我们Alice收到这个消息之后,首先对这个消息用相同的哈希算法产生一个新的指纹,然后再把携带的指纹的密文拿过来做一个解密算得到这个发送前Bob产生的指纹,把这两个指纹来比对,就可以验证消息的完整性。

由于这里对消息做了这个加密运算,所以攻击者也不能产生这个加密后的指纹的,所以这种方法同样可以保证消息的完整性,同样可以进行消息认证。另外我们还可以使用公钥密码体制来进行这个消息认证,发送方Bob产生消息,用哈希函数产生指纹,然后再用他自己的私钥公钥密码体制的私钥,对这个指纹做一个签名预算,也就做一个解密,得到一个数字签名,然后把这个数字签名附加在消息的后面,一起发送给接收方,发给迅速Alice,我们Alice同样也是用同样的哈希算法产生一个新的指纹,然后再把这个经过签名的指纹再恢复出来,用这个签名者Bob的公钥,对这个通过签名的指纹做一个加密运算,然后就把这个指纹恢复了,然后同样把这个新旧两个指纹做一个比对。那么这种方法就是使用公钥密码体制在进行这个认证的同时提供了这个数字签名,可以保证这个信源的认证和这个抗抵赖。

那么接下来我们再来看这个完整的模型,也就是说在一个通信过程当中,既保证了保密性,又提供了这个消息认证,还有数字签名.这个模型当中,发送方Bob同样产生消息m,然后对这个消息取指纹,然后接下来再用他的私钥对这个指纹做一个签名,把这个签名后的指纹附加在消息的后面。然后接下来要进行保密,用一个共享密钥k把这个附加了签名后的指纹的消息,一起来做一个加密运算,算得到这个密文,密文把它发送给接收方,接收方首先来做一个解密运算,解密出来的结果再把这个消息作为一个同样的哈希运算,得到一个新的指纹,然后同时再把这个消息当中附带的经过签名后的这个指纹用这个签名者的公钥做一个加密运算,把这个指纹给恢复出来,那么这前后两个指纹再来一个比对,从而实现这个消息的认证。那么在这个模型当中,由于最后施加了这个加密属于它提供了保密性,那么同时由于这个发送方,然后在指纹上面做了签名运算,所以他提供了数字签名,然后由于使用了这个呃哈希指纹作为消息认证的码,所以它又可以实现这个消息认证,这是一个完整的模型,完整的用法。

5.3 数字签名

5.3.1 数字签名概述

下面我们来学习数字签名。我们在前面介绍公钥密码体制的时候,用公开密码体制实现鉴别的过程如下图所示。首先签名者准备好要签名的信息,用他自己的私钥对这个信息做一个解密,算得到签名,将这个签名通过网络发送给接收方,验证者,验证者首先去获取签名者他的公钥,当然也可以事先把这个签名者的公钥获取回来,放到自己的公钥缓上面。然后第二步就是用这个签名者他的公钥对这个签名做一个加密算,如果这个加密算能够把这个签名信息给还原出来,就验证了这个签名它是真实的,而不是假冒的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOYPelej-1687880835257)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg)]

我们再来看数字签名的需求,我们前面介绍的消息认证,它可以保证这个消息传输它的完整性和真实性,可以保证通信双方数据交换不被第三方侵犯,但是它没办法保证不可否认性,没办法防止通信双方的相互欺骗。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xmIHtUk-1687880835257)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg)]

比如接收者b伪造了一个信息,声称是从a收到的,或者 b收到a发送过的信息,然后 a否认发过这样的信息。例如一个股票玩家通过邮件向股票经纪人发出了执行某项交易的命令,结果股票交易亏损后,他抵赖否认发送过这样的命令,要这个股票经纪人赔偿他的损失。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jlPE5WZ-1687880835257)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image018.jpg)]

如何杜绝这样的问题,杜绝通信双方来相互的欺骗,就采用数字签名机制。数字签名是防止通信的原点或终点否认或抵赖的一种认证技术。它是传统签名,比如说笔记签名的一种模拟,传统签名有什么样的特点?首先能够与被签的文件在物理上不可分割,签名者不能否认自己的签名,签名不能伪造,容易被验证。数字签名既然是传统签名的模拟,它也应该满足如下一些类似的要求,比如能够与所签的文件绑定,签名者不能否认自己的签名,签名不能被伪造,而且签名容易被自动的验证。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNnaHZsk-1687880835258)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg)]

数字签名可以表达为一个5元组,类似加密算法的5元组-mcksv,m代表所有消息组成的有限集,也就是所谓要签名的消息的有限集。c代表所有可能的签名组成的有限集,而k则是所有可能的密钥组成的有限集,s代表签名算法,v代表验证算法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jb6cWeWC-1687880835260)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg)]

这个签名通常表达为sig_K:M→C,用密钥k来做一个签名预算。签名是从消息的有限集m到这个签名有限集c的这样一个映射,而验证实际上就是结合消息和签名来做一个比对工作,这个比对的结果可以是真也可能是假。

具体的验证,就是从这个签名当中,通过验证运算去提取出这个消息出来,然后将这个消息与原来的签名消息做一个比对。如果这两者是相等的,说明这个签名是真实的,如果这两者不相等,说明这个签名是一个虚假的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uuu5tt4P-1687880835260)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg)]

结合前面数字签名的要求,我们来看一下数字签名的设计要求。签名是被签名信息的一个相关的二进制串,签名必须使用签名者唯一的信息,容易生成数字签名,同时容易验证数字签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zewf1GPH-1687880835261)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg)]

伪造签名在计算上面不可行。伪造包括两个方面,一个是已有签名伪造一个新的消息来与签名进行吻合。另外就是给定一个消息,然后伪造这个消息对应的数字签名,还有就是这个签名要在存储器当中进行保存,它是可行的。我们来看一下数字签名的算法,主要的数字签名算法就包括了前面介绍的RSA、EIGamal、DSS/DSA等等这些算法,具体算法这里就不再详细介绍。

5.3.2 数字签名的分类

下面来介绍数字签名的分类,数字签名的分类可以分为如下的几种,直接数字签名、重餐数字签名,群数字签名和盲数字签名。首先来看直接数字签名,直接数字签名又可以分为如下的4种子方案。

第一个方案是直接签名,签名者用自己的私钥对消息进行一个签名运算,产生签名后将这个消息和签名一起发送给接收方。这个方案当中消息是明文传送的,明文传送就有不保密被泄露的风险。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ikzaLsHE-1687880835262)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg)]

第二方案为了保密,可以在刚才的这个方案上面再加一个加密的操作。这个时候签名者爱丽丝在刚才的消息和他的签名的基础上面,用接收方bob的公钥对整个消息和签名作为一个加密算再发送给对方,对方收到之后,就首先要用自己的私钥来解密,解密完了之后,然后再来验证这个签名和这个消息是否是吻合的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IkhccprY-1687880835262)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image030.jpg)]

再来看第三个方案,哈希加签名的方案。如果前边签名的消息,它的数据量比较大的话,这个时候直接在消息上面签名,这个签名运算它的开销是比较大的,这个时候就可以先对消息做一个哈希运算,采集他的指纹,然后在这个消息的指纹上面来做签名运算。这个时候发送方就把这个消息、和在消息指纹上面的这个签名一起发送给接收方,接收方收到这个消息之后来进行相应的验证。首先把这个消息用相同的哈希算法采集一个新的指纹,然后再从这个签名当中去把原来的指纹还原出来,两个指纹来进行一个比对,如果相同的话,说明这个签名是真实的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUz7Zdys-1687880835263)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image032.jpg)]

再来看第4个方案,第4个方案是加密签名加哈希的方案,这个方案是在刚才第三个方案的基础上面,加上这个保密性的措施,我们把刚才第三个方案当中的完整的消息,用接收方的公钥再做一个加密运算,就可以实现保密了。接收方收到之后,首先也是做一个解密运算,然后完了之后再做一个相同的一个签名验证工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvK9lkuo-1687880835264)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image034.jpg)]

下面我们来看一下直接数字签名它的缺点,签名的有效性依赖于签名私钥的安全性,如果签名者他的私钥丢失或者被盗用了,这个时候获得这个私钥的攻击者就可以伪造签名。另外就是签名者他可以抵赖,本身这个私钥是没问题的,没有丢失或盗用,但是他声称这个私钥丢失了或者盗用了,然后其他人伪造他的签名,就抵赖自己的签名。针对这样一些问题如何来进行改进。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IAAGobKI-1687880835264)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image036.jpg)]

可以参考信用卡,我们在使用信用卡的时候会有一个相应的交易时间。同时银行要求,用户的信用卡一旦丢失了的情况下面,要及时的将这个情况报告给信用卡中心,将信用卡进行这个相应的挂失等处理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhpvogPG-1687880835264)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image038.jpg)]

借鉴这种思想,可以在这个数字签名的时候加一个时间戳,并且要求这个一旦签名是要暴露了,及时的报告给授权中心,采用这样的机制的话,仍然存在一些问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCQO0AWR-1687880835265)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image040.jpg)]

添加了时间戳之后,是否就彻底的解决了刚才直接数字签名它的缺点了?并没有,因为这个时间戳是由签名者自己添加的,这个时间戳本身是并不可信的,敌方可以伪造早于或者等于真实签名时间的一个时间戳来进行一个欺骗。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P24jQwrC-1687880835265)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image042.jpg)]

5.3.3 仲裁数字签名

仲裁数字签名引入仲裁者,发送方首先将签名信息送到仲裁者,仲裁者测试信息及其签名,然后检查其来源和内容,然后再将消息加上时间戳,并与仲裁验证通过的指示一起发送给接收者。仲裁者扮演敏感和关键的角色,所有参与者必须极大的相信这一仲裁机制它的正常工作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ETrbadB-1687880835265)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image044.jpg)]

接下来我们来看公钥密码加密文传送的仲裁签名方案。如下图所示,签名者是爱丽丝,最终的验证者是Bob,中间是仲裁Trent。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Sgigafu-1687880835266)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image046.jpg)]

首先签名者爱丽丝对消息做一个签名预算,然后再用验证方Bob他的公钥对这个签名做一个加密算,然后再将自己的ID一起再做一个签名预算,再添加自己的ID发送给仲裁。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dtz8yrjt-1687880835266)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image048.jpg)]

仲裁收到这个消息之后,首先通过ID确认是Alice发送的这样一个消息,然后就用爱丽丝对应的公钥来验证这个外层的签名。如果这个签名通过的话,仲裁再将这个签名当中的信息,也就是Alice的ID和这个经过加密的签名一起加上一个时间戳,用自己的私钥来再做一个签名发送给Bob。Bob验证者收到这个消息之后,首先要验证这个仲裁他的签名,用仲裁的公钥来验证这个签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2mMHX8iH-1687880835266)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image050.jpg)]

如果这个签名通过了,这个时候再来通过里边的时间戳里面的ID来确认这个消息是来自于Alice的,然后再去验证这个经过加密之后的这个签名,用自己的私钥把这个加密的信息解开,然后再来验证当中的Alice的签名。这个就通过密文传送实现了对仲裁的保密。全程仲裁它只能去验证签名的有效性,而不能获得这个信息它的内容。另外这里有两层签名,其中外层的签名是让仲裁去验证的,而内存的签名是交给接收方Bob他来进行验证的。仲裁主要的作用就是去验证这个签名的有效性,然后在签名有效的情况下面然后加一个可信的时间戳,然后让验证方去进行验证,从而避免了这个时间戳不可信的问题。

这个方案签名者是直接在这个消息m上面做的签名,所以这个不用再另外传递这个 m进行这个比对大。同学们这里可以思考一下,如果这个要签名的信息比较长的话,如何来使用哈希算法来对这个方案进行一个改进。

5.3.4 群数字签名

下面来看群数字签名,群数字签名是由 charm和then hissed,群数字签名是有charm和van hissed在1991年提出来的,群签名方案是一个群体当中的任意一个成员,可以以匿名的方式代表整个群体对消息进行签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZpFGyvfD-1687880835267)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image052.jpg)]

只有群成员能够代表所在的群签名,接受者能够验证签名所在的群,但是不知道是具体由谁签名的,需要的时候可以借助群成员或者可信的机构找到具体的签名者。

群签名方案在公共资源管理,重要军事情报的签发,重要领导人的选举,电子商务等重要新闻的发布,金融合同的签署等事务当中,群签名算都可以发挥重要的作用,群签名都可以发挥重要的作用。

这里是群签名过程的一个示意图。首先群管理者创建群公钥和群私钥,然后颁发这个群证书,群成员以及所有其他的用户都可以获得这个群证书,然后群成员就可以使用群公钥,然后群成员就可以使用群私钥来进行群签名,然后验证者就可以凭借群证书去验证群签名,群管理者可以去打开或者跟踪群签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qyqLlzTm-1687880835267)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image054.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nn7oH5tM-1687880835268)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image056.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZo5gOZB-1687880835268)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image058.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AAbB649H-1687880835268)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image060.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZCN5kXz-1687880835269)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image062.jpg)]

5.3.5 盲数字签名

下面来介绍盲数字签名,盲数字签名是保护消息的内容,对签名者不可见,也就是让签名者你只能签名而不能获取这个签名信息的内容。这个方案是 charm在1983年提出来的,在电子商务领域得到了广泛的应用。主要的场景有两个,一个电子的货币,还有就是电子的选举,电子的货币也就是现金,需要加上银行的数字签名才能够生效,可以通过盲签名来保护消费者的匿名性,也就是银行它只能签名,但是不知道这个电子现金或者电子货币它的使用情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tET2LSYi-1687880835269)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image064.jpg)]

再看电子选举,选民提交的选票必须要盖上选委会的数字签名才合法。盲签名可以保护选民的匿名性,让这个选委会不知道选民投票的情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xPk8WYim-1687880835269)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image066.jpg)]

再来看盲签名的性质,除了要满足一般数字签名的要求和条件外,还需要满足下面两条要求或者性质。一个就是签名者不知道其所签消息的具体内容。第二就是签名信息不可追踪,既当签名信息被公布之后,签名者也无法知道这是他的哪一次签署的这个签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9xTLleZz-1687880835270)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image068.jpg)]

再来看盲签名的步骤,主要分成了三步,第一步盲化,消息发送者首先将消息盲化;第二步就是签名,消息发送者将盲化后的消息发送给签名者,让签名者在盲化后的消息上面进行签名。第三步去盲,就是消息拥有者对这个盲人签名之后的消息,除去这个盲因子,得到签名者关于原消息的这个签名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VdpYlZOO-1687880835271)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image070.jpg)]

为了方便大家理解,这里举一个现实生活当中一个简单的盲签名方案,这个方案是针对传统的信件的。首先来看盲化,首先将这个要盲签的文件放到一个信封当中,第二步签名,先要在这个信封当中放一个复写纸,放到刚才要签名的文件上面,这个时候签名者隔着信封来签名,由于有复写纸的存在,他的签名会被复印到这个要签名的文件上面去。第三步去盲,就是打开信封把这个文件取出来,那这个时候这个文件就得到了签名者的签名。同时在签名过程当中,由于有信封的存在,所以签名者他是不知道要签名文件的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXgUxWRU-1687880835271)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image072.jpg)]

下面介绍一个基于RSA算法的盲签名方案,有两个用户Bob和Alice,爱丽丝就是签名者,他的公钥是e和n然后私钥是d,Bob要从爱丽丝这里得到一个盲签名,他准备他要签名的消息m然后还要产生一个随机数r,它就用这个 r来进行盲化。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvaPCFh3-1687880835272)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image074.jpg)]

首先第一步盲化,就是首先将这个 r用爱丽丝的公钥来做一个加密,也就是r的一次幂,然后再模除n,然后再将这个加密后的r乘上消息m,得到了t这个t就是盲化之后的消息,由于有这个 r的存在,所以Alice得到这个 t之后,并不能获取消息m的内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMwdxDD7-1687880835272)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image076.jpg)]

接下来第二步就是盲签名,爱丽丝就对这个 t做一个签名运算,也就是t的d次幂,然后再来模除n,我们把刚才得到的t带入到这个公式当中,我们就得到了m乘上r的一次幂,然后括号再来d次幂,然后再来模除,再进一步的计算,就得到了m的d次幂,然后乘上r再来模除来。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w21wgGO-1687880835272)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image078.jpg)]

学习了RSA算法,我们就知道最终要得到签名,实际上就是m的d次幂,再模除n,这里多了一个r,于是接下来第三步就是要去盲,刚才我们看到盲签名当中其实就多了一个r如何来去盲?这里非常简单了,我们就只需要再把这个r除去就可以了。所以就把刚才得到的t的低次幂模除n再来乘上r的-1次方,也就是除上一个r这个时候就可以把r去去除掉,这个时候就可以把这个随机数r去除掉,然后得到最终的签名,也就是m的第一次幂模除这个 n这个就通过r来进行了漫画,然后最后除去这个 r就实现了去盲,这就是基于rac的盲签名方案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YDJtqpE4-1687880835272)(file:///C:/Users/libin/AppData/Local/Temp/msohtmlclip1/01/clip_image080.jpg)]

原创声明

=======

作者: [ libin9iOak ]


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任。

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.28 周期信号的傅里叶变换

非周期信号的谱之所以是连续的,是因为非周期信号相当于信号是无穷大的,那w -> 0,因此就演变成了连续谱了 原来的Fn变成了高度为无穷小,w谱线之间拼起来的连续谱了,由于无穷小的量我们看不到它,那怎么办呢…

77、基于STM32单片机学生信息管理系统指纹密码控制设计(程序+原理图+参考论文+相关资料+开题报告+任务书+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

【TCP/IP】利用I/O复用技术实现并发服务器 - epoll

目录 select的缺陷 epoll函数 epoll_create epoll_ctl epoll_wait 基于epoll的回声服务器实现 select的缺陷 在之前,我们使用了select函数完成了对回声服务器端I/O的复用,但是从代码上依然存有缺陷,主要集中在: 每次调用se…

ModaHub魔搭社区:向量数据库Milvus性能优化问题(三)

目录 Milvus 的导入性能如何? 边插入边搜索会影响搜索速度吗? 批量搜索时,用多线程的收益大吗? 为什么同样的数据量,用 GPU 查询比 CPU 查询慢? Milvus 的导入性能如何? 客户端和服务端在同…

__attribute__机制

__attribute__((constructor))和 __attribute__((destructor)) __attribute__((constructor))&#xff1a;放在main函数之前执行的函数的前面。 __attribute__((destructor))&#xff1a;放在main函数之后执行的函数的前面。 测试代码 #include <stdio.h> #include &l…

RocketMQ 详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;RocketMQ 详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光…

【Shell】复制用户传参的文件夹

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

IDEA字体配置

IDEA默认字体&#xff1a;JetBrains Mono 1、下载Monaco字体&#xff08;windows版&#xff09;&#xff1a;下载地址&#x1f448; 2、双击安装 3、在IDEA中切换Monaco字体

帆软Json数据集插件,数据查询及参数控件传参

先看Demo 文本查询&#xff0c;下拉复选框查询&#xff0c;无参数时查全部 有参数传参时 1.定义数据连接 测试地址&#xff1a; http://fine-doc.oss-cn-shanghai.aliyuncs.com/book.json 2.新建json数据集&#xff0c;查询全表 2.1.查询全表 2.2.查询单个字段 3. 上述是简单…

CLion开发STM32

CLion开发STM32 opencd https://gnutoolchains.com/arm-eabi/openocd/ gcc-arm-none-eabi https://launchpad.net/gcc-arm-embedded/download arm-none-eabi-gcc -v“gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器。 mingw 需要把opencd和的工具链添加…

移远通信全新3GPP NTN R17模组正式上线,助力实现空天地海网络全覆盖

6月29日&#xff0c;在2023上海世界移动通信大会期间&#xff0c;物联网整体解决方案供应商移远通信正式宣布&#xff0c;推出符合3GPP NTN R17标准的全新5G卫星通信模组——CC950U-LS。该产品面向国内物联网市场&#xff0c;将为蜂窝网络无法覆盖的森林、海洋、沙漠等偏远地区…

抖音SEO矩阵源码开发(一)

前言&#xff1a; 1.抖音SEO矩阵系统源码开发 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言在服务器上安装LNMP环境&#xff0c;包括Linux操作系统、Nginx、MySQL、PHP等&#xff0c;如Java、Python等…

CTF安全竞赛介绍

目录 一、赛事简介 二、CTF方向简介 1.Web&#xff08;Web安全&#xff09; &#xff08;1&#xff09;简介 &#xff08;2&#xff09;涉及主要知识 2.MISC&#xff08;安全杂项&#xff09; &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;涉及主要知识 3…

Vue3 刨析响应式原理

ref 目标 了解 Vue &#xff0c;手写一个方法&#xff0c;实现响应式&#xff0c;并读懂响应式 源码 class MyRef {constructor(value) {this._value value}// 访问器get value() {console.log(触发 getter 函数 访问);return this._value}// 读取器set value(newVal) {cons…

基于Android新生预报到系统APP的设计与实现

1.引言 随着国家的教育方针政策的不断改变&#xff0c;自20世纪初以来&#xff0c;政府开始实施扩招计划&#xff0c;截至2020年我国大学生总规模己经攀升至近5000万&#xff0c;大学教育的普及化正在逐渐实现。随着大学新生数量的不断增多&#xff0c;到了每年的9月份&#x…

实现Linux(Ubuntu22.04)与Windows文件互通共享(双方永久往来~)

Samba服务器了解&#xff08;防守&#xff09; Samba是一个开源软件套件&#xff0c;它允许在不同操作系统之间共享文件、打印机和其他资源。它是基于SMB/CIFS协议&#xff0c;这是一种用于在Windows系统中共享文件和打印机的网络协议。Samba服务器可以在Linux、Unix、macOS和…

玩转C++调试之Python的GDB库增强

玩转C调试之Python的GDB库增强 0.导语 调试是软件开发过程中不可或缺的一环&#xff0c;而GDB&#xff08;GNU调试器&#xff09;作为一款功能强大的调试工具&#xff0c;在开发者中得到广泛应用。除了传统的命令行调试功能外&#xff0c;GDB还提供了Python的GDB库&#xff0c;…

2024考研408-计算机组成原理第五章-中央处理器学习笔记

文章目录 前言一、CPU的功能与基本结构1.1、CPU的功能1.2、运算器与控制器需要实现功能1.3、运算器的基本结构1.3.1、基本结构构成&#xff08;七个部分&#xff09;1.3.2、各个部件详细介绍①算数逻辑运算单元②通用寄存器组&#xff08;介绍数据通路的基本结构2个&#xff09…

C语言进阶---字符串+内存函数

本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy()strcat()strcmp() 长度受限制的的字符串函数 strncpy()strncat()strncmp() 字符串查找 strstr()strtok() 错误信息报告 strerror() 字符操作内存操作函…

《企业性能测试:体系构建、落地指导与案例解读》——小解送书第四期

目录 介绍 抽奖 介绍 软件系统性能的重要性无须多言&#xff0c;没有哪个用户可以忍受一个响应缓慢的网站或者反应迟钝的软件。软件性能是用户体验的核心。大部分用户可能对软件性能并不了解&#xff0c;但他们永远想使用响应更迅速的软件。所以&#xff0c;性能是评估一个软…