RSA到底是谁加密?

RRSA加密是最常用的非对称加密方式,原理是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。

但你一定会碰到过,两个开发者争执:到底是由谁加密,谁解密?

看完这篇文章,你就会明白这一切。

规范怎么说

我们先来看看权威库open_ssl的文档描述,它定义了四个方法

  • RSA_private_decrypt
  • RSA_private_encrypt
  • RSA_public_decrypt
  • RSA_public_encrypt

image-20200506190524159.png
看起来似乎私钥和公钥都可以用来进行加密解密?

但是仔细查看 RSA_public_decryptRSA_private_encrypt的描述都是:low level signature operations

点进详细描述,我们发现 RSA_public_decrypt 并没有真正的去解密,而仅仅是对密文进行验签!!!

也就是说,对于私钥加密内容,默认的标准包规范是只支持 公钥验签,并不支持公钥解密的。

使用场景

根据以上结论,我们知道规范默认是支持 公钥加密,私钥解密私钥加密,公钥验签

但是我们经常也会碰到私钥加密,公钥解密的情况,到底是怎么回事?其实我们使用RSA加密有常见的三种情况:

  1. 公钥加密,私钥解密

    最常用的一种情况,对接过支付宝就应该碰到过。

    接收方存一个私钥,发送方保存对应的公钥用来发送消息加密,能够确认消息不被泄露。

    所以支付宝会把他生成的一份公钥给你, 你需要把你生成的公钥给支付宝,你们的通信是建立在两对公私钥之上的。

  2. 私钥加密,公钥验签

    发送者把原文和密文同时发布,客户端使用公钥确认是由真正的发送者发出的。

    这种情况一般用于确认消息发布的真实性,可用于推送、广播和公开消息验证场景。

  3. 私钥加密,公钥解密

    这个本身不在推荐规范内的场景,现在却是很常见。

    例如离线软件授权,发布出去的软件里面保存一个公钥,软件厂商使用私钥加密包含到期时间的原文,得到密文,也就是授权码,软件验证的时候使用公钥解密授权码,对比当前时间,确认是否过期。

由于标准包里面并不支持公钥解密,像Golang这种的标准库里面仅仅按照标准包实现的语言,使用公钥解密方法的时候,就需要用到第三方库,或者自己hack。 但是对于老牌的编程语言 C, Java ,PHP 之类的,在标准包内就提供了公钥解密方法。

总结

所以我们能发现,RSA加密方式,并不是一定由谁加密,由谁解密。

而是得根据你的使用场景来定,至于公钥和私钥,其实在数学的概念上是一样的,都是能互相解密的,只是我们根据是公开,还是保存在自己手里来区分。公布出去,不怕泄露的就是公钥,保存在自己手里的就是私钥。

看完这篇文章,如果你觉得对你有帮助,请帮我点个赞。

如果文章有错漏之处,欢迎指出。


boywus
562 声望12 粉丝