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;