2012-08-10 95 views
4

我有一個讓我發瘋的問題。使用PHP的非對稱加密

我已經創建了一個對密鑰做:

$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文件,我發現:

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

我可以解密使用公開數據鑰匙 ??爲什麼?

我知道公鑰對ENCRYPT數據有用,但只有私鑰的所有者纔可以對數據進行DECRYPT。

如果我可以使用公鑰解密數據,讓知道公鑰的用戶很容易解密這些消息。

有人可以解釋這一點給我嗎?我正在尋找一種方法來使用兩個鍵,第一個加密,第二個(僅第二個)加密。

感謝

回答

2

正如前面所說的使用情況,這是與公共密鑰crypting它使接收器能使用自己的私鑰解密。使用的形式給出了以下代碼Alice能夠成功地將消息發送給Bob

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

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

這是你在你的代碼有基本的基礎設施,現在是代碼鮑勃執行。 Bob生成密鑰對併發送給Alice,在真實環境中必須有公鑰共享機制。

當Alice得到Bob的公鑰,她cyphers她的消息與此密鑰:

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

最後Bob收到消息並對其解密

openssl_private_decrypt($pvt_msg, $bob_received_msg, $key); 
print $bob_received_msg; 
5

公鑰加密的整體思路是,每一個「用戶」擁有「公鑰」和「私鑰」。這些密鑰有三個主要實現:機密,身份驗證和組合。 在我的回答中,我將採用'機密'技術。

每個用戶都有一個'公鑰',它們分發給其他用戶並用於加密將被髮回的郵件,還有一個'私鑰',它們只保留給自己用於解密他們將收到的消息。 您用來加密郵件的密鑰與用於解密的密鑰不同。的 'confedential鍵使用'

例子:

Bob有:鮑勃私鑰,鮑勃的公鑰,愛麗絲公鑰
Alice有:愛麗絲的私鑰,愛麗絲公鑰,鮑勃公鑰

鮑勃發送消息愛麗絲
Bob使用'愛麗絲公共密鑰' 來加密消息,並將其發送=>
Alice使用'愛麗絲私鑰' 解密消息。

愛麗絲希望回覆和發送一個消息給鮑勃
Alice使用'鮑勃公鑰' 來加密消息,將其發送=>
Bob使用'鮑勃私鑰' 至解密該消息。

公共密鑰只用來加密消息
私有密鑰只用於解密消息公鑰

現在你知道加密是什麼「公鑰」和「的基本思路私鑰「是,have a look at this image explaining the typical SSL communication and the use of the keys.

+0

我知道如何加密工程Asimmetric ...正如你給我寫的,每個用戶使用其他用戶的公鑰來加密消息,但只有擁有相應私鑰的用戶才能對消息進行解密。這正是我需要的。我有的問題(疑問)是爲什麼兩個密鑰,如果我可以用一個密鑰加密/解密?我的重點是有一個密鑰加密和一(私人)解密...我可以使用PHP嗎? – Dail 2012-08-10 18:20:00

+0

我相信我現在明白你在找什麼。 如果要使用私鑰進行加密並使用公共密鑰進行解密,則應在加密端使用openssl_private_encrypt(),並在解密端使用openssl_public_decrypt()。我剛剛注意到你在開篇文章中使用了openssl _ ** public_encrypt()**。 – 2012-08-10 18:39:25

+0

如果我使用私鑰加密應該有人使用私鑰解密郵件?我問你,因爲如果我必須使用私鑰,我會把它放在我的PHP腳本中......我不希望有人可以讀取.php文件可以使用私鑰(我將寫入一個變量)解密我的ecrypted消息 – Dail 2012-08-10 19:10:10

1

簽名,一種散列證明私鑰的所有者創建了加密的郵件。很好,愛麗絲證明鮑勃給她寫了一條消息(用愛麗絲的公鑰加密) - 而不是喬。 Bob使用他的私人密鑰創建一個獨特的簽名,Alice可以使用Bob的公開確認。

:)