为什么 PHP 中有openssl_public_decrypt?公钥不是应该仅用于加密吗?



我为我的无知提前道歉。

我正在试验公钥密码术,试图了解RSA。

从我阅读的每一个来源来看,我的理解都是有两个关键:

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

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

PHP将有openssl_public_encrypt、openssl_private_encrypt和openssl_private_decrypt,这对我来说完全有意义。openssl_private_encrypt,例如;用私有私钥加密数据;。

然而,在PHP中还有一个函数";openssl_public_decrypt";它特别地说";解密先前通过openssl_private_encrypt((加密的数据";以及";"用公钥解密数据";。

如果有一个函数能够使用公钥进行解密,而公钥是公共的,那么加密数据有什么意义呢?

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

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

  1. Alice编写了给Bob的明文消息(msg(。

  2. 然后Alice使用抗冲突摘要算法对msg进行散列

    digest = hash(msg)
    
  3. 然后Alice使用她的私钥priv加密digest,得到密文c

    c = encrypt(digest, priv)
    
  4. Alice然后通过任何介质向Bob发送msgc

  5. Bob已经知道Alice对应的公钥(pub(,他对摘要进行解密,并将他接收到的明文消息内容的摘要与解密后的散列进行比较

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

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

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

最新更新