PHP的RSA加密解密方法以及开发接口使用
网络安全问题很重要,尤其是保证数据安全,遇到很多在写接口的程序员直接都是明文数据传输,在我看来这是很不专业的。本人提倡经过接口的数据都要进行加密解密之后进行使用。
这篇文章主要介绍使用PHP开发接口,数据实现RSA加密解密后使用,实例分析了PHP自定义RSA类实现加密与解密的技巧,非常具有实用价值,需要的朋友可以参考下。
简单介绍RSA
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新手对它不太了解。下面仅作简要介绍。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者RonRivest,AdiShamir,LeonardAdleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。
下面为具体类、实例:
_getPublicKey($public_key_file); } if($private_key_file){ $this->_getPrivateKey($private_key_file); } } //私有方法 /** *自定义错误处理 */ privatefunction_error($msg) { die('RSAError:'.$msg);//TODO } /** *检测填充类型 *加密只支持PKCS1_PADDING *解密支持PKCS1_PADDING和NO_PADDING * *@paramint填充模式 *@paramstring加密en/解密de *@returnbool */ privatefunction_checkPadding($padding,$type) { if($type=='en'){ switch($padding){ caseOPENSSL_PKCS1_PADDING: $ret=true; break; default: $ret=false; } }else{ switch($padding){ caseOPENSSL_PKCS1_PADDING: caseOPENSSL_NO_PADDING: $ret=true; break; default: $ret=false; } } return$ret; } privatefunction_encode($data,$code) { switch(strtolower($code)){ case'base64': $data=base64_encode(''.$data); break; case'hex': $data=bin2hex($data); break; case'bin': default: } return$data; } privatefunction_decode($data,$code) { switch(strtolower($code)){ case'base64': $data=base64_decode($data); break; case'hex': $data=$this->_hex2bin($data); break; case'bin': default: } return$data; } privatefunction_getPublicKey($file) { $key_content=$this->_readFile($file); if($key_content){ $this->pubKey=openssl_get_publickey($key_content); } } privatefunction_getPrivateKey($file) { $key_content=$this->_readFile($file); if($key_content){ $this->priKey=openssl_get_privatekey($key_content); } } privatefunction_readFile($file) { $ret=false; if(!file_exists($file)){ $this->_error("Thefile{$file}isnotexists"); }else{ $ret=file_get_contents($file); } return$ret; } privatefunction_hex2bin($hex=false) { $ret=$hex!==false&&preg_match('/^[0-9a-fA-F]+$/i',$hex)?pack("H*",$hex):false; return$ret; } /** *生成签名 * *@paramstring签名材料 *@paramstring签名编码(base64/hex/bin) *@return签名值 */ publicfunctionsign($data,$code='base64') { $ret=false; if(openssl_sign($data,$ret,$this->priKey)){ $ret=$this->_encode($ret,$code); } return$ret; } /** *验证签名 * *@paramstring签名材料 *@paramstring签名值 *@paramstring签名编码(base64/hex/bin) *@returnbool */ publicfunctionverify($data,$sign,$code='base64') { $ret=false; $sign=$this->_decode($sign,$code); if($sign!==false){ switch(openssl_verify($data,$sign,$this->pubKey)){ case1: $ret=true; break; case0: case-1: default: $ret=false; } } return$ret; } /** *加密 * *@paramstring明文 *@paramstring密文编码(base64/hex/bin) *@paramint填充方式(貌似php有bug,所以目前仅支持OPENSSL_PKCS1_PADDING) *@returnstring密文 */ publicfunctionencrypt($data,$code='base64',$padding=OPENSSL_PKCS1_PADDING) { $ret=false; if(!$this->_checkPadding($padding,'en'))$this->_error('paddingerror'); if(openssl_public_encrypt($data,$result,$this->pubKey,$padding)){ $ret=$this->_encode($result,$code); } return$ret; } /** *解密 * *@paramstring密文 *@paramstring密文编码(base64/hex/bin) *@paramint填充方式(OPENSSL_PKCS1_PADDING/OPENSSL_NO_PADDING) *@parambool是否翻转明文(WhenpassingMicrosoftCryptoAPI-generatedRSAcyphertext,revertthebytesintheblock) *@returnstring明文 */ publicfunctiondecrypt($data,$code='base64',$padding=OPENSSL_PKCS1_PADDING,$rev=false) { $ret=false; $data=$this->_decode($data,$code); if(!$this->_checkPadding($padding,'de'))$this->_error('paddingerror'); if($data!==false){ if(openssl_private_decrypt($data,$result,$this->priKey,$padding)){ $ret=$rev?rtrim(strrev($result),"\0"):''.$result; } } return$ret; } }
此为具体的RSA类
'; $pubfile='D:\WWW\test\rsa_public_key.pem'; $prifile='D:\WWW\test\rsa_private_key.pem'; $rsa=newRSA($pubfile,$prifile); $rst=array( 'ret'=>200, 'code'=>1, 'data'=>array(1,2,3,4,5,6), 'msg'=>"success", ); $ex=json_encode($rst); //加密 $ret_e=$rsa->encrypt($ex); //解密 $ret_d=$rsa->decrypt($ret_e); echo$ret_e; echo''; echo$ret_d; echo''; $a='test'; //签名 $x=$rsa->sign($a); //验证 $y=$rsa->verify($a,$x); var_dump($x,$y); exit;