PHP實現RSA簽名和驗簽


PHP實現RSA簽名和驗簽

密鑰生成

Mac和Linux 用戶

安裝openssl

生成1024位的私鑰,不指定的話默認2048位
后逐條輸入如下指令:

$ openssl 					#進入 OpenSSL 程序
OpenSSL> genrsa -out rsa_private_key.pem 1024   	#生成私鑰
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem 		#Java開發者需要將私鑰轉換成PKCS8格式
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公鑰
OpenSSL> exit  					#退出 OpenSSL 程序

拓展:RSA加密算法, PKCS#1 和PKCS#8區別是什么?

疑問:使用base64_encode編碼之后出現的+和/在http的get傳輸過程中會出現+變成空格的請。

可以使用下面兩個方法解決:

function _base64url_encode($data) {
	return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
	
function _base64url_decode($data) {
	$str = str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT);
	return base64_decode($str);
}

PHP實現RSA用私鑰簽名

$privatekey = openssl_get_privatekey( file_get_contents($private_key_file_path) );
$signedStr = '';
openssl_sign($signStr, $signedStr, $privatekey, OPENSSL_ALGO_SHA256);
openssl_free_key($privatekey);
$sign = $this->_base64url_encode($signedStr);

PHP實現RSA用公鑰驗簽

$public_key = openssl_get_publickey( file_get_contents($pub_key_file_path) );
if(empty($public_key)){
	return false;
}
$sign = base64_decode($sign);
$ok = openssl_verify( $sign_str, $sign, $public_key, OPENSSL_ALGO_SHA256 ); //SHA256
openssl_free_key( $public_key );
if ($ok == 1) {
	$result = true;
} elseif ($ok == 0) {
	$result = false;
} else {
	MLog::write('DEBUG', __CLASS__.' ' . __FUNCTION__ . ' 0 openssl_error_str '.json_encode(openssl_error_string));
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM