数字签名
上篇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),若两者相等,即消息完整,验证成功,否则失败。
这样,消息的来源及完整性就验证完了。那么,试想,如果发送方抵赖发送某一消息或者他的私钥丢失,有人伪造他签署文件,这时该怎么办呢?这就要引入可信第三方,即仲裁者了,如果某人的私钥丢失,他要在第一时刻通知仲裁者,仲裁者可在网络上公布:该人私钥丢失,此刻以后看到他签署的文件,统统不可信!那么问题又来了,如果伪造者伪造了一份在该时间之前的文件,又该如何辨别呢?其实就是时间戳。由仲裁者给每份签名的文件附上时间戳,这样就可以避免这个问题。所以,以上这些问题都可以由可仲裁数字签名方法来解决。
------------------------------------------------------可仲裁数字签名-----------------------------------------------------------
敬请期待~~~~~~~~~~~~~~~~
上一篇: spark安装(win7单机模式)
下一篇: Java使用RSA加密解密签名及校验