PHP使用openssl實現RSA加解密
阿新 • • 發佈:2018-12-30
業務場景就不用說了,有很多地方都用的到。在此寫出一個例子,一來供自己查閱,二來分享一下。。。
生成公鑰、私鑰的方法網上有很多,不過有個簡單的方法:
引用博友寫好的,點選連結檢視:linux下如何生成公鑰和私鑰
獲取到公鑰、私鑰之後,來看加密解密~~~~~~
- 在此提一下跨語言問題(php-java),通過介面傳輸後,對方(java)解密出來的可能得到的是ASCII編碼過的位元組。
加解密的方式如下(本人覺的公鑰私鑰放到檔案中更合適):
先看加密方法,加密方式有兩種,一為使用cmd來生成,在程式碼中使用系統函式。二為基本程式碼實現。
加密方式一:
//公鑰加密 /*** *$data :需加密資料 *$pubFile :公鑰檔案路徑+名稱 * ***/ function pubEncryptFileKey_cmd($data,$pubFile){ if(empty($data) || empty($pubFile)){ return ''; } $cmd = "echo -n '{$data}' | openssl rsautl -encrypt -pubin -inkey {$pubFile} | openssl enc -base64 -A"; $retval = -1; $ret = system($cmd,$retval); ob_clean(); if(0 != $retval || empty($ret)){ return ''; } return $ret; }
加密方式二:
//公鑰加密 /*** *$data :需加密資料 *$pubFile :公鑰檔案路徑+名稱 * ***/ function pubEncryptFileKey($data,$pubFile){ if(empty($data) || empty($pubFile)){ return ''; } $fp = fopen($pubFile,"r"); if(false === $fp){ return ''; } $vpos_pubkey = fread($fp,8192); fclose($fp); return pubEncrypt($data,$vpos_pubkey); } function pubEncrypt($data,$pubkey){ $encrypted = ''; $r = openssl_public_encrypt($data, $encrypted, $pubkey); if($r){ return base64_encode($encrypted); } return ''; }
上面兩種加密方式本質上是一樣的。下面來看解密方法:
解密方式:
//私鑰解密 /*** *$encrypted :密文 *$pubFile :私鑰檔案路徑+名稱 * ***/ function privDecryptFileKey($encrypted,$privFile){ $fp = fopen($privFile,"r"); if(empty($encrypted) || false === $fp){ return ''; } $vpos_prikey = fread($fp,8192); fclose($fp); $prikey = openssl_pkey_get_private($vpos_prikey); $ostr = privDecrypt($encrypted,$prikey); return $ostr; } function privDecrypt(){ $encrypted = base64_decode($encrypted); $r = openssl_private_decrypt($encrypted,$decrypted,$prikey); if($r){ return $decrypted; } return ''; }