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