我有一个让我发疯的问题。
我创建了一对键:
$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。
由于
答案 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)
通常在不对称的公钥/私钥中输入:
使用该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的公钥加密整个消息)。