RSA数字签名算法

1.数字签名。

数字签名无非就两个目的:

  • 证明这消息是你发的;
  • 证明这消息内容确实是完整的---也就是没有经过任何形式的篡改(包括替换、缺少、新增)

这种是两个目的都达到了,还有一些只达到一个目的
公钥和私钥都可以用来加密或解密---只要能保证用A加密,就用B解密就行。至于A是公钥还是私钥,其实可以根据不同的用途而定。例如说,如果你想把某个消息秘密的发给某人,那你就可以用他的公钥加密。因为只有他知道他的私钥,所以这消息也就只有他本人能解开,于是你就达到了你的目的。
但是如果你想发布一个公告,需要一个手段来证明这确实是你本人发的,而不是其他人冒名顶替的。那你可以在你的公告开头或者结尾附上一段用你的私钥加密的内容(例如说就是你公告正文的一段话),那所有其他人都可以用你的公钥来解密,看看解出来的内容是不是相符的。如果是的话,那就说明这公告确实是你发的---因为只有你的公钥才能解开你的私钥加密的内容,而其他人是拿不到你的私钥的。

其实,上面关于“公告”那段内容,已经证明了第一点:证明这消息是你发的。那么要做到第二点,也很简单,就是把你公告的原文做一次哈希(md5或者sha1都行),然后用你的私钥加密这段哈希作为签名,并一起公布出去。当别人收到你的公告时,他可以用你的公钥解密你的签名,如果解密成功,并且解密出来的哈希值确实和你的公告原文一致,那么他就证明了两点:这消息确实是你发的,而且内容是完整的。
其实概念很简单:

  • 小明想秘密给小英发送消息
  • 小英手里有一个盒子(public key),这个盒子只有小英手里的钥匙(private key)才打得开
  • 小英把盒子送给小明(分发公钥)
  • 小明写好消息放进盒子里,锁上盒子(公钥加密)
  • 小明把盒子寄给小英(密文传输)
  • 小英用手里的钥匙打开盒子,得到小明的消息(私钥解密)
  • 假设小刚劫持了盒子,因为没有小英的钥匙,他也打不开

2.RSA加密算法过程简述

这边文章总结为:

A和B进行加密通信时,B首先要生成一对密钥。一个是公钥,给A,B自己持有私钥。A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密内容。
要想B发送消息,A会先计算出消息的消息摘要,然后使用自己的私钥加密这段摘要加密,最后将加密后的消息摘要和消息一起发送给B,被加密的消息摘要就是“签名”。
B收到消息后,也会使用和A相同的方法提取消息摘要,然后使用A的公钥解密A发送的来签名,并与自己计算出来的消息摘要进行比较。如果相同则说明消息是A发送给B的,同时,A也无法否认自己发送消息给B的事实。
其中,A用自己的私钥给消息摘要加密成为“签名”;B使用A的公钥解密签名文件的过程,就叫做“验签”。
数字签名的作用是保证数据完整性,机密性和发送方角色的不可抵赖性
下面是对签名和验签过程的简要描述:
签名过程:

  1. A计算消息m的消息摘要,记为 h(m)
  2. A使用私钥(n,d)对h(m)加密,生成签名s ,s满足:
    s=(h(m))^d mod n;
    由于A是用自己的私钥对消息摘要加密,所以只用使用s的公钥才能解密该消息摘要,这样A就不可否认自己发送了该消息给B。
  3. A发送消息和签名(m,s)给B。

验签过程:

  1. B计算消息m的消息摘要,记为h(m);
  2. B使用A的公钥(n,e)解密s,得到
    H(m) = s^e mod n;
  3. B比较H(m)与h(m),相同则证明

下面简单总结加密和解密的完整过程。
签名过程:

  1. A提取消息m的消息摘要h(m),并使用自己的私钥对摘要h(m)进行加密,生成签名s
  2. A将签名s和消息m一起,使用B的公钥进行加密,生成密文c,发送给B。

验证过程:

  1. B接收到密文c,使用自己的私钥解密c得到明文m和数字签名s
  2. B使用A的公钥解密数字签名s解密得到H(m).
  3. B使用相同的方法提取消息m的消息摘要h(m)
  4. B比较两个消息摘要。相同则验证成功;不同则验证失败。