2014-06-21 281 views
2

我在PHP這個測試代碼:PHP openssl加密解密錯誤?無效的公鑰/私鑰?

function genPGP() { 
    // Create the keypair 
    $res=openssl_pkey_new(); 
    // Get private key 
    openssl_pkey_export($res, $prK, bin2hex(mcrypt_create_iv(100, MCRYPT_DEV_URANDOM))); 
    // Get public key 
    $puK = openssl_pkey_get_public($prK); 
    return array($prK,$puK); 
} 

function prKeyDecrypt($data,$key){ 
    if (openssl_private_decrypt($data, $r, $key)) { 
     return $r; 
    } 
} 

$keys = genPGP(); 
$prK = $keys[0]; 
$puK = $keys[1]; 
$data = 'abc123'; 
openssl_public_encrypt($data,$encrypted,$puK); 
echo prKeyDecrypt($encrypted,$prK); 

我得到兩個錯誤,他們都相似,它們分別是:

Warning: openssl_public_encrypt(): key parameter is not a valid public key in test2.php on line 23 

Warning: openssl_private_decrypt(): key parameter is not a valid private key in test2.php on line 14 

我不知道什麼是「有效......關鍵「。有沒有不同的方式我應該得到鑰匙?根據手冊和我讀過的內容,這看起來很準確。

+1

只是注意:你的代碼沒有任何關係PGP 。 –

+0

感謝您的澄清。它也不是真正的「安全套接字層」。我一直把公鑰/私鑰加密作爲PGP。這基本上是PGP(特別是它的實現方式),我認爲,它的管理方式不同,不使用相同的驗證/信任系統(根據[本頁](http://security.stackexchange.com/questions/) 39765 /公共密鑰-上的OpenSSL VS-PGP))。我希望公鑰/私鑰密碼術有一個更簡單/更簡單的術語。 – JVE999

回答

2

你非常接近。首先,不要使用密碼加密您的私鑰。其次,直接從資源獲取公鑰。即:

function genPGP0() { 
    // Create the keypair 
    $res=openssl_pkey_new(); 
    // Get private key 
    openssl_pkey_export($res, $prK); 
    // Get public key 
    $puK = openssl_pkey_get_details($res)["key"]; 
    return array($prK,$puK); 
} 

如果你想使用一個密碼(你要存儲的私鑰),你可以使用類似:

function genPGP() { 
    // Create the keypair 
    $res=openssl_pkey_new(); 
    // Get private key 
    $pass = bin2hex(mcrypt_create_iv(100, MCRYPT_DEV_URANDOM)); 
    openssl_pkey_export($res, $prK_encrypted, $pass); 
    $prK = openssl_pkey_get_private($prK_encrypted, $pass); 
    // Get public key 
    $puK = openssl_pkey_get_details($res)["key"]; 
    return array($prK,$puK); 
} 
+0

作爲該問題的延伸,如果在SO上允許,我將如何將'$ prK'存儲在會話變量中,如$ _SESSION ['prK']'。簡單的賦值'$ _SESSION ['prK'] = $ keys [0]'存儲數字0,並且在將其分配爲參考時發生同樣的事情。 '$ _SESSION [ 'PRK'] =&$鍵[0]'。 – JVE999

+1

你應該問一個新問題。我不使用PHP--我更喜歡Ruby,所以我不熟悉PHP中的會話變量。乾杯! –