2013-05-31 96 views
5

好吧,這是我第一次在一個項目上使用加密技術。我正在使用我的託管服務提供商提供SSL,但我也想要加密部分敏感的數據庫。爲此,我被告知使用OpenSSL。我正在我的本地主機(WAMP)上測試它,並安裝了OpenSSL並打開了PHP和Apache SSL mods。好的,所以我一直在關注教程,並且使用幾種建議的方法,已經能夠生成公鑰並將其作爲文件存儲。出於某種原因,我似乎無法生成私鑰。我會後的代碼兩個版本,我已經試過:OpenSSL不會創建私鑰?

// generate private key 
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
)); 
// write private key to file 
openssl_pkey_export_to_file($privateKey, 'private.key'); 
// generate public key from private key 
$publicKey = openssl_pkey_get_details($privateKey); 
// write public key to file 
file_put_contents('public.key', $publicKey['key']); 
// clear key 
echo $privateKey; 

?> 

這生成一個public.key文件,但爲我提供的警告「openssl_pkey_export_to_file():無法從參數1獲得關鍵:」和「openssl_pkey_get_details( )期望參數1是資源,布爾值。「當試圖

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf", 
    "digest_alg" => "sha512", 
    "private_key_bits" => 1024, 
    "private_key_type" => OPENSSL_KEYTYPE_RSA, 
); 

// Create the private and public key 
$res = openssl_pkey_new($config); 

// Extract the private key from $res to $privKey 
openssl_pkey_export($res, $privKey, NULL); 
echo "Private Key: ".$privKey; 
// Extract the public key from $res to $pubKey 
$pubKey = openssl_pkey_get_details($res); 
$pubKey = $pubKey["key"]; 
echo "Public Key: ".$pubKey; 
$data = 'plaintext data goes here'; 
echo "Data: ".$data; 
// Encrypt the data to $encrypted using the public key 
openssl_public_encrypt($data, $encrypted, $pubKey); 
echo "Encrypted: ".$encrypted; 
// Decrypt the data using the private key and store the results in $decrypted 
openssl_private_decrypt($encrypted, $decrypted, $privKey); 

echo "Decrypted: ".$decrypted; 

這本來呼應的一切,不幸的是我的結果是一個空白的私鑰,罰款公共密鑰,明文和密文,和一個錯誤:

我也嘗試過其他方法解密:「openssl_private_decrypt():關鍵參數不是有效的私鑰」

很明顯,我有一個私鑰創建問題。我已經徹底地搜索了互聯網,並且無法修復它,儘管我已經實現了簡單的代碼,似乎適用於其他人。

由於提前, 埃利Zeitouni

+0

你檢查過函數的返回值嗎? – doptimusprime

回答

2

我想你可能有一個更簡單的時間phpseclib, a pure PHP RSA implementation。以下示例將創建一個1024位RSA私鑰/公鑰:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 

extract($rsa->createKey()); 

echo $privatekey . '<br/>' . $publickey; 
?> 
+0

謝謝!這只是解決了我的問題:) –

5

我知道它已經有一段時間,你可能已經解決了這個問題,但我認爲我的回答可以是誰面臨着同樣的問題,其他人有幫助的(像我一樣)。

所以,如果你看看openssl_pkey_export()文檔,你會發現它有四個不同的參數。如果我們看看你的第二個實現,我們可以看到你只提供了三個。

openssl_pkey_export($ res,$ privKey,NULL);

如果只有您的服務器具有適用於OPENSSL_CONF的環境變量,這將會一樣好。鏈接到openssl.cnf文件(需要使用XAMPP下載的README-SSL.txt文件中引用的文件)才能使用PHP的CSR和密鑰生成函數。

要使用PHP中的CSR和密鑰生成功能,您需要安裝openssl.cnf文件。我們在本文件夾中包含了一個可用於此目的的示例文件,與此自述文件一起。

因爲這個原因,就像您爲openssl_pkey_new($config);所做的一樣,您必須創建一個包含config =>'/path/to/openssl.cnf'的關聯數組。就像這樣:

openssl_pkey_export($res, $privKey, NULL, $config); 

我想補充一點,在我的情況openssl.cnf中的路徑裏面:

C:\ XAMPP \ PHP \演員\ OpenSSL的\ openssl.cnf中

在這裏你還可以找到一個README-SSL.txt文件,它可以很好地解釋如何配置OPENSSL。

希望它有幫助。 :)

3

在xampp php 5.5中使用windows10工作在我的腦海中徘徊。最後計算出的tabone上面的答案是正確的方向除了路徑格式需要被正向削減!

C:/xampp/php/extras/openssl/openssl.cnf 

希望這可以幫助別人。

1

use:openssl_pkey_export_to_file($ result,'privkey.pem',null,$ config);