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

このコードを使用する$pubKeyと、 と$privKey.

正しく暗号化/復号化できますが、DECRYPTIONに関して大きな疑問があります。

現時点では、次のことを行ってデータを暗号化しています。

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

データは正しく暗号化されますが、PHP Doc を読むと、次のことがわかりました。

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

PUBLIC KEYを使用してデータを復号化できますか?? どうして ??

公開鍵がデータの ENCRYPT に役立つことは知っていますが、秘密鍵の所有者だけがデータを DECRYPT できます。

公開鍵を使用してデータを復号化できる場合は、公開鍵を知っているユーザーがメッセージを簡単に復号化できるようにします。

誰かが私にこれを説明できますか?最初のキーを ENCRYPT に、2 つ目 (2 つ目のみ) を DECRYPT に使用する方法を探しています。

ありがとう

4

4 に答える 4

12

非対称の公開鍵/秘密鍵の暗号化では、通常:

  1. ボブは自分の公開鍵と秘密鍵のペアを生成しました
  2. ボブは自分の公開鍵を共有しました
  3. アリスはボブの公開鍵でメッセージを暗号化します
  4. 彼女はメッセージを送ります
  5. Bob だけが自分の秘密鍵で復号化できます。

ここに画像の説明を入力

これで、 opensslライブラリを使用して基本的な暗号化を学習できます。次のコードは本番ソフトウェアには適していないことに注意してください。非対称暗号化の基本を学ぶためだけに使用してください。

そのアプローチと次のコードを使用して、アリスはボブにメッセージを正常に送信できます

/**  BOB CODE  **/
$key = openssl_pkey_new(array('private_key_bits' => 2048));

$bob_key = openssl_pkey_get_details($key);
$bob_public_key = $bob_key['key'];

これは、コードに含まれていた基本的なインフラストラクチャであり、ボブが実行するコードです。ボブは鍵ペアを生成し、アリスに送信します。実際の環境では、公開鍵共有メカニズムが必要です。

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 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で使用するための完全なマニュアルを確認してください

注意深く読んでください。暗号化は 1 週間で習得できるものではありません。いくつかの注意事項があります。

于 2015-05-21T10:15:01.293 に答える
7

公開鍵暗号化の全体的な考え方は、すべての「ユーザー」が「公開鍵」と「秘密鍵」を持っているということです。これらのキーには、機密、認証、結合の 3 つの主要な実装があります。私の答えでは、「機密」手法を使用します。

各ユーザーには、配布する「公開鍵」があり、他のユーザーが返送されるメッセージを暗号化するために使用します。彼らは受け取ります。メッセージの暗号化に使用したキーは、復号化に使用したキーと同じではありません。

「機密キーの使用」の例:

Bob has : Bob private key, Bob public key, Alice public key
Alice has : Alice private key, Alice public key, Bob public key

BobはAliceにメッセージを送信したい: Bob は「Alice 公開鍵」を使用してメッセージを暗号化し、送信します => Alice は「Alice 秘密鍵」を使用してメッセージを復号化します。

Aliceは返信を希望し、Bob にメッセージを送信します。Alice
「Bob 公開鍵」を使用してメッセージを暗号化し、送信します =>
Bob は「Bob 秘密鍵」を使用してメッセージを復号化します。

公開鍵はメッセージの暗号化にのみ使用されます
秘密鍵は、公開鍵で暗号化されたメッセージの復号化にのみ使用されます

「公開鍵」と「秘密鍵」の基本的な考え方がわかったので、典型的な SSL 通信と鍵の使用を説明するこの画像を見てください。

于 2012-08-10T17:51:43.080 に答える
3

署名は、秘密鍵の所有者が暗号化されたメッセージを作成したことを証明する一種のハッシュです。ボブが彼女にメッセージを書いたこと (アリスの公開鍵で暗号化されたもの) をアリスが証明するのに適しています - ジョーではありません。ボブは秘密鍵を使用して一意の署名を作成し、アリスはボブの公開鍵を使用して確認できます。

:)

于 2013-03-05T18:49:35.810 に答える