PHP中为何存在openssl_public_decrypt?公钥不是仅用于加密吗?
关于RSA私钥加密+公钥解密的作用说明
你混淆了非对称密码体系的两类核心应用场景,openssl_private_encrypt + openssl_public_decrypt的组合完全不是为了保密传输,而是为了实现数字签名与身份校验,这是非对称密码另一项和加密传输同等重要的能力。
场景1:保密传输(你已理解的逻辑)
这个场景的核心目标是保证传输内容仅被指定接收方读取,流程为:
- 发送方获取接收方的公钥,调用
openssl_public_encrypt加密敏感内容 - 密文在公开网络传输,就算被攻击者截获,没有接收方私钥也无法解密
- 接收方拿到密文后调用
openssl_private_decrypt用自己的私钥解密得到原文
这个流程符合你之前理解的「公钥加密后仅私钥可解」的逻辑,核心解决的是数据传输的保密性问题。
场景2:数字签名(私钥加密+公钥解密的实际用途)
这个场景的核心目标完全不是保密,而是证明内容的发布者身份、保证内容未被篡改,流程为:
- 内容发布方持有自己严格保密的私钥,对要发布的内容(一般是内容的哈希值,因为非对称加密处理长文本效率极低)调用
openssl_private_encrypt加密,加密得到的结果就是「数字签名」 - 发布方将原始内容和签名一起公开发送
- 所有接收方都可以拿到发布方公开的公钥,调用
openssl_public_decrypt解密签名,得到发布方加密的哈希值 - 接收方自行计算收到的原始内容的哈希值,和解密得到的哈希值对比:如果一致,就能证明两个核心结论:
- 这份内容确实是持有对应私钥的发布方发出的,因为只有发布方拥有私钥,能生成公钥可以成功解密的签名
- 内容在传输过程中没有被篡改,篡改后的内容计算出的哈希会和解密得到的哈希不匹配
这类场景最常见的落地就是HTTPS证书校验:网站返回的SSL证书包含了CA(证书颁发机构)用自身私钥生成的签名,浏览器内置了可信CA的公钥,通过公钥解密验证签名通过后,就能确认当前网站的证书是合法CA签发的,不是攻击者伪造的。
认知补正
你之前提到的「私钥既可以加密数据,也可以解密数据」需要加场景限定:私钥解密的是其他人用对应公钥加密发给你的密文,私钥加密的是要对外发布的签名内容,两类操作的适用场景完全不同,解决的问题也完全不同,并不冲突。
内容的提问来源于stack exchange,提问作者azoundria
相关产品推荐
相关产品推荐

