7

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

我创建了一对键:

$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"];

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

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

目前我加密数据正在做:

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

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

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

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

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

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

有人可以向我解释一下吗?我正在寻找一种使用两个密钥的方法,第一个用于加密,第二个(仅第二个)用于解密。

谢谢

4

4 回答 4

12

在非对称公钥/私钥加密中,通常:

  1. Bob 生成了他的公钥/私钥对
  2. Bob 分享了他的公钥
  3. 爱丽丝用鲍勃的公钥加密一些消息
  4. 她发信息
  5. 只有 Bob 可以用他的私钥解密。

在此处输入图像描述

现在我们可以使用openssl库来学习基本的密码学了。请注意,以下代码不适用于生产软件,仅用于学习非对称加密的基础知识。

使用该方法和以下代码,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;

推荐用于生产的加密库

如果您的目标是安全的生产系统,请使用 libsodium。有了它,您可以加密消息...

// Generating your encryption key
$key = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_KEYBYTES);

// Using your key to encrypt information
$nonce = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_NONCEBYTES);
$ciphertext = \Sodium\crypto_secretbox('test', $nonce, $key);

...并解密消息...

$plaintext = \Sodium\crypto_secretbox_open($ciphertext, $nonce, $key);
if ($plaintext === false) {
    throw new Exception("Bad ciphertext");
}

...除其他事项外。

什么是随机数?

查看完整手册以将其与 PHP 一起使用

仔细阅读,加密不是一个星期就能学会的东西。有一些警告。

于 2015-05-21T10:15:01.293 回答
7

公钥密码学的整个想法是每个“用户”都有一个“公钥”和一个“私钥”。这些密钥有 3 种主要实现方式:机密、认证和组合。在我的回答中,我将采用“机密”技术。

每个用户都有一个他们分发的“公钥”,其他用户将使用它来加密将发送回的消息,以及一个他们只为自己保留的“私钥”,用于解密发送回的消息他们会收到。您用于加密消息的密钥与用于解密的密钥不同。

“机密密钥使用”示例:

Bob 拥有:Bob 私钥、Bob 公钥、Alice 公钥
Alice 拥有:Alice 私钥、Alice 公钥、Bob 公钥

Bob想向Alice发送一条消息: Bob 使用“Alice 公钥”加密消息,发送它 => Alice 使用“Alice 私钥”解密消息。

Alice想要回复并向 Bob 发送一条消息
Alice 使用“Bob 公钥”加密消息,发送它 =>
Bob 使用“Bob 私钥”解密消息。

公钥仅用于加密消息
私钥仅用于解密使用公钥加密的消息

既然您知道“公钥”和“私钥”的基本概念是什么,请看一下这张图片,解释典型的 SSL 通信和密钥的使用。

于 2012-08-10T17:51:43.080 回答
3

签名,一种证明私钥所有者创建加密消息的哈希。有利于 Alice 证明 Bob 给她写了一条消息(用 Alice 的公钥加密)——而不是 Joe。Bob 使用他的私钥创建一个唯一的签名,Alice 可以使用 Bob 的公钥来确认。

:)

于 2013-03-05T18:49:35.810 回答
1

简答

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

长答案

非对称加密双向工作。

那么为什么还有一个openssl_public_decrypt()函数呢?你可能会问。正如文档所述,它可以解密已由私钥加密的消息。正如之前沃利提到的,这可以用于签名。

假设 Alice 等待来自 Bob 的消息,而不是来自其他任何人的消息。所以 Bob 使用他自己的私钥来加密消息(例如使用openssl_private_encrypt())。当 Alice 收到任何消息时,她会尝试使用 Bob 的公钥对其进行解密。如果这成功了,她就知道消息来自 Bob。

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

于 2019-08-02T11:32:59.750 回答