RSA非对称加密解密

来源:互联网 发布:mysql 清空 tmp目录 编辑:程序博客网 时间:2024/06/05 14:37
公钥加密私钥解密是密送,保证消息即使公开也只有私钥持有者能读懂。
私钥加密公钥解密是签名,保证消息来源是私钥持有者。

目前的计算能力,公钥有效时间内推不出私钥,私钥也推不出公钥。这个不要钻牛角尖。

如果私钥算不出公钥 那公钥是哪来的.是一次运算中,同时生成的。 就像你随机生成一个无重根的二次方程,那两个根是同时出来的。你把方程忘了,只知道一个根是求不出另一个的。 类似的道理,当然原理比这复杂多啦。

其实公钥和私钥都可以用来加密或解密---只要能保证用A加密,就用B解密就行。至于A是公钥还是私钥,其实可以根据不同的用途而定。

例如说,如果你想把某个消息秘密的发给某人,那你就可以用他的公钥加密。因为只有他知道他的私钥,所以这消息也就只有他本人能解开,于是你就达到了你的目的。

但是如果你想发布一个公告,需要一个手段来证明这确实是你本人发的,而不是其他人冒名顶替的。那你可以在你的公告开头或者结尾附上一段用你的私钥加密的内容(例如说就是你公告正文的一段话),那所有其他人都可以用你的公钥来解密,看看解出来的内容是不是相符的。如果是的话,那就说明这公告确实是你发的---因为只有你的公钥才能解开你的私钥加密的内容,而其他人是拿不到你的私钥的。

最后再说一下数字签名。
数字签名无非就两个目的:
证明这消息是你发的
证明这消息内容确实是完整的---也就是没有经过任何形式的篡改(包括替换、缺少、新增)。

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

RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。

公钥用于对数据进行加密,私钥用于对数据进行解密

RSA签名体制。签名体制同样包含3个算法:KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)。

私钥用于对数据进行签名,公钥用于对签名进行验证。这也可以直观地进行理解:对一个文件签名,当然要用私钥,因为我们希望只有自己才能完成签字。验证过程当然希望所有人都能够执行,大家看到签名都能通过验证证明确实是我自己签的。

RSA的加密/验证,解密/签字过程太像了。同时,RSA体制本身就是对称的:如果我们反过来把e看成私钥,d看成公钥,这个体制也能很好的执行。我想正是由于这个原因,题主在学习RSA体制的时候才会出现这种混乱。那么解决方法是什么呢?建议题主可以学习一下其他的公钥加密体制以及签名体制。其他的体制是没有这种对称性质的。举例来说,公钥加密体制的话可以看一看ElGamal加密,以及更安全的Cramer-Shoup加密。签名体制的话可以进一步看看ElGamal签名,甚至是BLS签名,这些体制可能能够帮助题主更好的弄清加密和签名之间的区别和潜在的联系。


经销商的私钥是他自己保留的,公钥是可以发布给所有人的,用私钥加密后的内容,理论上说,可以被网上所有的人所阅读的(任何人得到加密后的文本后,只要找到公钥,就可以解密)所以这个加密本身是没有意义的。而唯一能确定的是,这段密文,肯定是经销商用他的私钥加密的,是这个经销商发出的,他人是无法仿冒的,这就叫签名。
而正真的加密,其实是要用接受方的公钥加密,然后传给接受方,这样就只有接受方可以解密并阅读,这才是正真的加密办法。
具体的加密流程如下:
生成随机key
对称加密(明文,随机key)->密文
rsa加密(随机key,接受方公钥)->加密的key
密文+加密的key传输给接受方
rsa解密(加密的key,接受方私钥)->随机key
对称解密(密文,随机key)->明文
而签名过程就不一样:
rsa签名(明文,发出方私钥)->签名串
明文+签名串传输给接受方
rsa验证签名(明文,发出方公钥,签名串)->true/false
注:签名的时候,会先对明文进行hash运算,这样可以减少加密的量


摘自:http://www.zhihu.com/question/25912483

0 0
原创粉丝点击