標籤:pat err 文字 需要 signature turn ext ase error
RSA加密傳輸:
對於初接觸RSA加密的童鞋來說,很可能會被繞進去。最近寫了一個RSA加密傳輸的需求,總結一下。希望能對你有點協助。
首先要明白以下幾點:
1:公開金鑰和私密金鑰一定是成對的才可以
2:私密金鑰是保密的,公開金鑰是公開的
3:公開金鑰和私密金鑰,可以互為加密和解密
4:用其中一個祕密金鑰加密資料,則只有對應的那個密鑰才能解開
主要有兩種用法
1:公開金鑰加密
A傳輸資料給B
(1),A用公開金鑰加密資料,傳輸給B
(2),B用私密金鑰解密
2:公開金鑰認證
A傳輸資料給B
(1),A用私密金鑰加密資料(也就是私密金鑰簽名),傳輸給B
(2),B用公開金鑰解密(也就是驗簽)
樣本:認證,公開金鑰認證的過程
簽名:
/** signing 簽名 password 私密金鑰認證要求輸入密碼 */ public function get_signing_str($data){ //$data=$this->get_request_string(); $certs=array(); // dump(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx")); openssl_pkcs12_read(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx"), $certs, "password"); if(!$certs) return; $signature = ‘‘; openssl_sign($data, $signature, $certs[‘pkey‘],‘sha256‘); //dump(base64_encode($signature)); return base64_encode($signature); }
驗簽:
public function verify_signing($rest){ $rest=json_decode($rest,true); $sign=$rest[‘sign‘]; $sign = base64_decode($sign);//簽名參數 unset($rest[‘sign‘]); unset($rest[‘sign_type‘]); $verifystr=$this->get_request_str($rest);//驗簽明文字串 $pkeyid = openssl_pkey_get_public(file_get_contents(ROOT_PATH."public/static/"."public_key.cer")); $verify = openssl_verify($verifystr,$sign,$pkeyid,‘sha256‘); //驗簽 (明文/簽名/key) // $msg = openssl_error_string(); // dump($msg); // dump($verify); openssl_free_key($pkeyid); if($verify==1){ echo ‘驗簽通過‘; // $data=json_encode($rest); // return $data; }else{ return ‘驗簽失敗‘; } }
RSA加密過程
$privateKeyStr=file_get_contents(ROOT_PATH."public/static/"."pkcs1_key.pem"); $pi_key=openssl_pkey_get_private($privateKeyStr); $encryptSign=""; openssl_private_encrypt($sign_str,$encryptSign,$pi_key); //(待加密字串/加密後的字串/key)
SHA加密過程
$sign = hash(‘sha256‘,$source); //(演算法/待加密字串)
RSA 加密傳輸 (php)