使用PHP进行非对称加密

时间:2012-08-10 16:48:06

标签: php openssl public-key-encryption

我有一个让我发疯的问题。

我创建了一对键:

$res = openssl_pkey_new(array('private_key_bits' => 2048));

/* Extract the private key from $res to $privKey */
openssl_pkey_export($res, $privKey);

/* Extract the public key from $res to $pubKey */
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];

使用此代码,我有$pubKey$privKey

我可以正确加密/解密,但我对 DECRYPTION 有很大疑问。

目前我在加密数据时:

openssl_public_encrypt($data, $encrypted, $pubKey);

它正确地加密了我的数据,但是阅读PHP Doc,我发现:

http://php.net/manual/en/function.openssl-public-decrypt.php

我可以使用 PUBLIC KEY 来解密数据吗?为什么??

我知道公钥对于ENCRYPT数据很有用,但只有私钥的所有者才能解析数据。

如果我可以使用公钥解密数据,请让知道公钥的用户轻松解密这些消息。

有人可以向我解释一下吗?我正在寻找一种方法来使用两个键,第一个是ENCRYPT,第二个(只有第二个)是DECRYPT。

由于

4 个答案:

答案 0 :(得分:6)

公钥加密的整体思想是每个“用户”都有一个“公钥”和一个“私钥”。这些密钥有3种主要实现:机密,经过身份验证和组合。 在我的回答中,我将采用'保密'技术。

每个用户都有一个他们分发的“公钥”,另一个用户将使用该“公钥”加密将要发回的邮件,以及他们只保留用于解密的“私钥”他们将收到的消息。 您用于加密邮件的密钥与用于解密的密钥不同。

'联合密钥使用'的示例:

  

Bob :Bob私钥,Bob公钥, Alice公钥
   Alice有:Alice私钥,Alice公钥, Bob公钥

Bob 想要发送消息 Alice
Bob使用'Alice公钥'来加密消息,发送它=>
Alice使用'Alice私钥'来解密消息。

Alice 想要回复并且向Bob发送消息
Alice使用'Bob公钥'来加密消息,发送它=>
Bob使用'Bob私钥'来解密消息。

  

公钥仅用于加密邮件
  私钥仅用于解密使用公钥加密的邮件

既然您知道“公钥”和“私钥”的基本概念是什么,have a look at this image explaining the typical SSL communication and the use of the keys.

答案 1 :(得分:4)

通常在不对称的公钥/私钥中输入:

  1. Bob生成了公钥/私钥对
  2. Bob分享了他的公钥
  3. Alice使用Bob的公钥隐藏了一些消息
  4. 她发送消息
  5. 只有Bob可以使用私钥解密。
  6. enter image description here

    使用该aproach和以下代码,Alice可以成功地向Bob发送消息

    /**  BOB CODE  **/
    $key = openssl_pkey_new(array('private_key_bits' => 2048));
    
    $bob_key = openssl_pkey_get_details($key);
    $bob_public_key = $bob_key['key'];
    

    这是您在代码中使用的基本基础结构,现在是Bob执行的代码。 Bob生成密钥对并发送给Alice,在真实环境中必须有公钥共享机制。

    当Alice获得Bob的公钥时,她用这个密钥加密她的消息:

    /** ALICE CODE **/
    $alice_msg = "Hi Bob, im sending you a private message";
    openssl_public_encrypt($alice_msg, $pvt_msg, $bob_public_key);
    

    最后Bob接收消息并对其进行解密

    /**  BOB CODE **/
    openssl_private_decrypt( $pvt_msg, $bob_received_msg, $key);
    print $bob_received_msg;
    

答案 2 :(得分:3)

签名,一种证明私钥所有者的哈希创建了加密消息。爱丽丝很好地证明鲍勃给她写了一条消息(用爱丽丝的公钥加密) - 而不是乔。 Bob使用他的私钥创建一个唯一的签名,Alice可以使用Bob的公开来确认。

:)

答案 3 :(得分:1)

简短回答

用公钥加密的消息只能用匹配的私钥解密。

长答案

非对称加密同时起作用。

那为什么还要有openssl_public_decrypt()函数呢?你可能会问。根据{{​​3}}的说明,它可以解密已由私钥加密的消息。如之前提到的沃利所说,它可以用于签名。

比方说,爱丽丝在等待鲍勃发来的消息,而不是其他人发来的消息。因此,鲍勃使用自己的私有密钥来加密邮件(例如,使用openssl_private_encrypt())。当爱丽丝收到任何邮件时,她都会尝试使用鲍勃的公钥对其进行解密。如果成功的话,她知道消息来自鲍勃。

请注意,使用私钥加密将不安全,因为任何人(有权访问公钥)都可以解密消息。在实践中,您可能会同时使用这两种方法(附加使用Bob的私钥加密的签名,然后使用Alice的公钥加密整个消息)。