为啥 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗?

Posted

技术标签:

【中文标题】为啥 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗?【英文标题】:Why Is There openssl_public_decrypt in PHP? Isn't the Public Key Supposed to Be For Encryption Only?为什么 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗? 【发布时间】:2022-01-06 20:21:52 【问题描述】:

我为我的无知提前道歉。

我正在尝试使用公钥加密来了解 RSA。

从我阅读的每个来源中我的理解是有两个关键:

    公钥。任何人都可以使用它来加密数据,只能通过私钥解密。 私钥。这可以加密或解密数据。

据我了解,公钥是公开的,所以任何人都可以知道,而私钥是保密的。据我了解,拥有公钥和私钥的一个主要原因是数据可以用公钥加密,然后通过不安全的环境存储或发送给接收者。我们希望确保拥有加密数据/密文和公钥的对手无法获得原始数据。

对我来说,php 将具有 openssl_public_encrypt、openssl_private_encrypt 和 openssl_private_decrypt 是完全有意义的。 openssl_private_encrypt,例如“使用私有 private_key 加密数据”。

然而,在 PHP 中还有一个函数“openssl_public_decrypt”specifically says它“解密之前通过 openssl_private_encrypt() 加密的数据”和“使用公钥解密数据”。

如果有一个函数可以使用公钥解密,而公钥是公开的,那么加密数据的意义何在?

【问题讨论】:

【参考方案1】:

这最常用于必须验证消息发送者的身份或所传递数据的完整性的场景,通常称为数字签名

考虑这个假设场景:Alice 想要与 Bob 通信,Bob 需要确保 Alice 已经编写了消息并且消息在传输过程中没有被篡改。假设 Alice 和 Bob 已经通过 Diffie-Hellman(或类似的可信机制)进行了公钥交换。

    Alice 向 Bob (msg) 发送她的明文消息。

    Alice 然后使用抗冲突摘要算法对msg 进行哈希处理

    digest = hash(msg)
    

    Alice 然后使用她的私钥priv 加密digest,得到密文c

    c = encrypt(digest, priv)
    

    Alice 然后通过任何媒介向 Bob 发送 msgc

    已经知道 Alice 对应的公钥 (pub) 的 Bob 解密摘要并将他收到的明文消息内容的摘要与解密后的哈希值进行比较

    hash(msg) === decrypt(c, pub)
    

如果第 5 步中的比较成功,Bob 可以合理地保证消息没有被篡改,并且 Alice(或有权访问 Alice 的私钥的人)是消息的原始作者。

如果没有使用公钥解密的能力,就不可能进行这种类型的验证。

【讨论】:

以上是关于为啥 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 echo 语句没有在我的 PHP 代码中生成任何内容?

为啥 PHP 中有 openssl_public_decrypt?公钥不应该只用于加密吗?

为啥python中有不相等的运算符[重复]

为啥我们在 PHP 中将一些变量声明为“$_variablename”...? [复制]

为啥 PHP 不使用传递的参数填充 $_POST?

php __destruct 为啥通过 file_get_contents 得到不同的结果