代码之家  ›  专栏  ›  技术社区  ›  azoundria

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

  •  0
  • azoundria  · 技术社区  · 3 年前

    我为自己的无知提前道歉。

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

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

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

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

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

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

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

    0 回复  |  直到 3 年前
        1
  •  1
  •   esqew    3 年前

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

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

    1. 爱丽丝给鲍勃写了一条清晰的短信( msg ).

    2. 爱丽丝接着散列 消息 使用抗冲突摘要算法

      digest = hash(msg)
      
    3. 爱丽丝然后加密 digest 使用她的私钥 priv ,导致密文 c

      c = encrypt(digest, priv)
      
    4. 然后Alice将两者都发送给Bob 消息 c 在任何介质上。

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

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

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

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