複製代碼 代碼如下:
<?php
//pki加密
//使用pki加密需要開啟 openssl擴充
//php.ini extension = php_openssl.dll擴充
/*pki模式是
* 公開金鑰加密,私密金鑰解密;
* 私密金鑰加密,公開金鑰解密;
*/
//私密金鑰加密,公開金鑰解密
//用戶端
//$data資料
$data = 'abcd';
//擷取私密金鑰 $priv_key_id
$priv_key_id = openssl_get_privatekey(file_get_contents('99bill-rsa.pem', r));
//擷取公開金鑰 $pub_key_id
$pub_key_id = openssl_get_publickey(file_get_contents('99bill-rsa.cer', r));
//$data首選通過SHA1雜湊加密,然後通過$priv_key_id私密金鑰加密,產生簽名$signature
//$signature就是加密過的簽名
//openssl_sign()加密函數,至於它的解密方法我不知道??????????????????????
openssl_sign($data, $signature, $priv_key_id, OPENSSL_ALGO_SHA1);
//還有兩種加密函數,而且這兩種加密函數有解密方法,知道
//第一種:私密金鑰加密,公開金鑰解密
//$data要加密的資料,$crypted是加密產生的資料,$decrypted是解密產生的資料; $data與$decrypted值相同
//通過$priv_key_id私密金鑰加密,產生$crypted;
openssl_private_encrypt($data, $crypted, $priv_key_id);
echo $crypted;
//通過$pub_key_id公開金鑰解密,產生$decrypted
openssl_public_decrypt($crypted, $decrypted , $pub_key_id);
//第二種:公開金鑰加密,私密金鑰解密
//$data要加密的資料,$crypted是加密產生的資料,$decrypted是解密產生的資料; $data與$decrypted值相同
//通過$pub_key_id公開金鑰加密,產生$crypted;
openssl_public_encrypt($data, $crypted, $pub_key_id);
//通過$priv_key_id私密金鑰解密,產生$decrypted
openssl_private_decrypt($crypted, $decrypted, $priv_key_id);
//注意事項,我這邊的擷取公開金鑰與私密金鑰的檔案是不對應的
//正常情況,擷取公開金鑰與私密金鑰檔案是一一對應的,這裡我使用快錢的。
//快錢給了私密金鑰組建檔案,對應的公開金鑰組建檔案在快錢那邊
//快錢給了公開金鑰組建檔案,對應的私密金鑰組建檔案在快錢那邊
//也就是缺少了一個公開金鑰組建檔案和一個私密金鑰組建檔案
//我始終沒找到一個一一對應的私密金鑰、公開金鑰組建檔案,如果你找的了發我一份,謝謝。
// openssl_verify()方法驗證簽名是否正確(私密金鑰加密產生的資料返回來,用對應的公開金鑰驗證),只有這一種情況。
// $signature公開金鑰加密產生的資料,$data未經處理資料,成功返回1,失敗返回0,錯誤返回-1
// $pub_key_id公開金鑰
openssl_verify($data, $signature, $pub_key_id);
//從記憶體中釋放私密金鑰或公開金鑰
openssl_free_key($priv_key_id);
openssl_free_key($pub_key_id);
產生私密金鑰與公開金鑰
genrsa -out private-rsa.pem
rsa -in private-rsa.pem -pubout -out pubic-rsa.cer