加密的内容长度限制为密钥长度少11位,如128位的密钥最多加密的内容为117个长度。
私钥加签:
/** * * @param $data 待签名数据 * @return string 签名结果 */ public function opensslPrivateEnsign($data) { $private_key = ROOT_PATH . 'data/cert/rsa_private_key.pem'; $priKey = file_get_contents($private_key); $private_key = openssl_get_privatekey($priKey); $sign = ''; openssl_sign($data, $sign, $private_key); openssl_free_key($private_key); $sign = base64_encode($sign);//最终的签名 return $sign; }
公钥验签:
/** * openssl 公钥验签 * @param $original_str * @param $sign * @return string */ public function opensslPublicVerifySign($original_str, $sign) { $public_key = ROOT_PATH . 'data/cert/rsa_public_key.pem'; $pubKey = file_get_contents($public_key); $public_key = openssl_get_publickey($pubKey); $sign = base64_decode($sign);//得到的签名 $result = (bool)openssl_verify($original_str, $sign, $public_key); openssl_free_key($public_key); return $result; }
公钥加密:
/** * openssl根据公钥加密 * @param $data 待签名数据 * @return string 签名结果 */ public function opensslPublicEncrypt($data) { $public_key_path = ROOT_PATH . 'data/cert/rsa_public_key.pem'; $pubKey = file_get_contents($public_key_path); $public_key = openssl_get_publickey($pubKey); $original_arr = str_split($data, 117); //折分 foreach ($original_arr as $o) { $sub_enc = null; openssl_public_encrypt($o, $sub_enc, $public_key,OPENSSL_PKCS1_PADDING); $original_enc_arr[] = $sub_enc; } openssl_free_key($public_key); $original_enc_str = base64_encode(implode('', $original_enc_arr));//最终网络传的密文 return $original_enc_str; }
私钥解密:
/** * openssl根据私钥解密 * @param $encryptData * @return string */ public function opensslPrivateDescrypt($encryptData) { $private_key_path = ROOT_PATH . 'data/cert/rsa_private_key.pem'; $priKey = file_get_contents($private_key_path); $private_key = openssl_get_privatekey($priKey); $original_enc_str = base64_decode($encryptData); $orig_dec_str = ''; for ($i = 0; $i < strlen($original_enc_str) / 128; $i++) { $data = substr($original_enc_str, $i * 128, 128); openssl_private_decrypt($data, $decrypt, $private_key,OPENSSL_PKCS1_PADDING); $orig_dec_str .= $decrypt; } return $orig_dec_str; }
注:私钥加密及公钥解密同理。
转载请注明:苏demo的别样人生 » php中rsa加密及解密和签名及验签