欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数字签名

程序员文章站 2022-07-04 14:16:05
...

        上篇RSA中提出的数字签名技术,它是一个应用很广泛的技术,数字签名的目的是对数字对象的合法性、真实性进行标记,并提供签名者的承诺。那如何实现呢?

        我们常用的是基于公钥密码算法的数字签名方法,即非对称密码*,这里我们用RSA来实现。那么,数字签名又分为直接数字签名和可仲裁数字签名两大类,后面一一讲解。

        简而言之,前面其实就是用RSA的私钥加密,发送给对方,对方用你的公钥解密,这就可以唯一的确定消息时你发出的,而不会被他人伪造。

 

--------------------------------------------------------直接数字签名-----------------------------------------------------------

        在签名的同时,当然也要保证消息的保密性,那为了不泄露消息,发送方就要对发送的所有内容进行加密,这里我们使用对称密钥来加密(DES或者流密码),进一步说,在传递消息的过程中,即使可以认证发送人,那消息是否完整,是否被篡改过呢?这又是一个需要解决的问题,即消息完整性验证,那可以先对消息进行散列(MD5或者SHA-1),形成消息摘要,再进行签名。

        简单的介绍一下散列算法,其实散列算法就是对变长的消息进行摘要,并且有固定长度的输出。并且知道消息正向求出散列值很容易,但反向推到在计算上不可行,且对于任意两个不同的消息m和m‘,它们的散列值不可能相同。

具体算法如下:

        A(发送方)--> B(接收方):Ek [ M || Eka [ H(M) ] ] 或 Ek [ M ] || Eka [ H(M) ]

        [注]:Ek是对称密钥加密,Eka是用A的私钥加密,H(M)为散列算法,

                 前后两者均可,前者保密性较高,后者效率较高,这里讲解前者。

       显然,B收到这个消息时,首先可以用对称密钥将M || Eka [ H(M) ]提取出来,那由于H(m)长度是固定的,进行Eka操作后长度也是固定的,那B就可以根据长度还原出明文M,以及Eka [ H(M) ]。此时,B就可以对发送者进行认证了,用A的公钥(网络上公开)对Eka [ H(M) ]解密,若解密成功,即消息时A发来的,否则认证失败。最后一步,完整性如何验证?

       在认证完来源后,B可获得H(M),那根据之前提前到的明文M,在进行一次散列算法,求出新的H(M),若两者相等,即消息完整,验证成功,否则失败。

       这样,消息的来源及完整性就验证完了。那么,试想,如果发送方抵赖发送某一消息或者他的私钥丢失,有人伪造他签署文件,这时该怎么办呢?这就要引入可信第三方,即仲裁者了,如果某人的私钥丢失,他要在第一时刻通知仲裁者,仲裁者可在网络上公布:该人私钥丢失,此刻以后看到他签署的文件,统统不可信!那么问题又来了,如果伪造者伪造了一份在该时间之前的文件,又该如何辨别呢?其实就是时间戳。由仲裁者给每份签名的文件附上时间戳,这样就可以避免这个问题。所以,以上这些问题都可以由可仲裁数字签名方法来解决。

------------------------------------------------------可仲裁数字签名-----------------------------------------------------------

 

敬请期待~~~~~~~~~~~~~~~~