1. 程式人生 > >PHP使用openssl實現RSA加解密

PHP使用openssl實現RSA加解密

業務場景就不用說了,有很多地方都用的到。在此寫出一個例子,一來供自己查閱,二來分享一下。。。

生成公鑰、私鑰的方法網上有很多,不過有個簡單的方法:

引用博友寫好的,點選連結檢視: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 '';			
}