RRSA加密是最经常使用的非对称加密方式,原理是对一极大整数作因数分解的困难性来保证安全性。一般我的保存私钥,公钥是公开的(可能同时多人持有)。编程
但你必定会碰到过,两个开发者争执:究竟是由谁加密,谁解密?安全
看完这篇文章,你就会明白这一切。编程语言
咱们先来看看权威库open_ssl的文档描述,它定义了四个方法加密
看起来彷佛私钥和公钥均可以用来进行加密解密?spa
可是仔细查看 RSA_public_decrypt
和RSA_private_encrypt
的描述都是:low level signature operations
code
点进详细描述,咱们发现 RSA_public_decrypt
并无真正的去解密,而仅仅是对密文进行验签!!!blog
也就是说,对于私钥加密内容,默认的标准包规范是只支持 公钥验签,并不支持公钥解密的。支付宝
根据以上结论,咱们知道规范默认是支持 公钥加密,私钥解密 和 私钥加密,公钥验签 的ssl
可是咱们常常也会碰到私钥加密,公钥解密的状况,究竟是怎么回事?其实咱们使用RSA加密有常见的三种状况:开发
最经常使用的一种状况,对接过支付宝就应该碰到过。
接收方存一个私钥,发送方保存对应的公钥用来发送消息加密,可以确认消息不被泄露。
因此支付宝会把他生成的一份公钥给你, 你须要把你生成的公钥给支付宝,大家的通讯是创建在两对公私钥之上的。
发送者把原文和密文同时发布,客户端使用公钥确认是由真正的发送者发出的。
这种状况通常用于确认消息发布的真实性,可用于推送、广播和公开消息验证场景。
这个自己不在推荐规范内的场景,如今倒是很常见。
例如离线软件受权,发布出去的软件里面保存一个公钥,软件厂商使用私钥加密包含到期时间的原文,获得密文,也就是受权码,软件验证的时候使用公钥解密受权码,对比当前时间,确认是否过时。
因为标准包里面并不支持公钥解密,像Golang这种的标准库里面仅仅按照标准包实现的语言,使用公钥解密方法的时候,就须要用到第三方库,或者本身hack。 可是对于老牌的编程语言 C, Java ,PHP 之类的,在标准包内就提供了公钥解密方法。
因此咱们能发现,RSA加密方式,并非必定由谁加密,由谁解密。
而是得根据你的使用场景来定,至于公钥和私钥,其实在数学的概念上是同样的,都是能互相解密的,只是咱们根据是公开,仍是保存在本身手里来区分。公布出去,不怕泄露的就是公钥,保存在本身手里的就是私钥。
看完这篇文章,若是你以为对你有帮助,请帮我点个赞。
若是文章有错漏之处,欢迎指出。