荟萃馆

位置:首页 > 设计 > 网页设计

PHP实现RSA加密类的实例解析

* RSA算法

PHP实现RSA加密类的实例解析

* 签名及密文编码:base64字符串/十六进制字符串/二进制字符串流

* 填充方式: PKCS1Padding(加解密)/NOPadding(解密)

*

* Notice:Only accepts a single block. Block size is equal to the RSA key size!

* 如密钥长度为1024 bit,则加密时数据需小于128字节,加上PKCS1Padding本身的11字节信息,所以明文需小于117字节

*

* @author: linvo

* @version: 1.0.0

* @date: 2013/1/23

*/

class RSA{

private $pubKey = null;

private $priKey = null;

/**

* 自定义错误处理

*/

private function _error($msg){

die(RSA Error: . $msg); //TODO

}

/**

* 构造函数

*

* @param string 公钥文件(验签和加密时传入)

* @param string 私钥文件(签名和解密时传入)

*/

public function __construct($public_key_file = , $private_key_file = ){

if ($public_key_file){

$this->_getPublicKey($public_key_file);

}

if ($private_key_file){

$this->_getPrivateKey($private_key_file);

}

}

/**

* 生成签名

*

* @param string 签名材料

* @param string 签名编码(base64/hex/bin)

* @return 签名值

*/

public function sign($data, $code = base64){

$ret = false;

if (openssl_sign($data, $ret, $this->priKey)){

$ret = $this->_encode($ret, $code);

}

return $ret;

}

/**

* 验证签名

*

* @param string 签名材料

* @param string 签名值

* @param string 签名编码(base64/hex/bin)

* @return bool

*/

public function verify($data, $sign, $code = base64){

$ret = false;

$sign = $this->_decode($sign, $code);

if ($sign !== false) {

switch (openssl_verify($data, $sign, $this->pubKey)){

case 1: $ret = true; break;

case 0:

case -1:

default: $ret = false;

}

}

return $ret;

}

/**

* 加密

*

* @param string 明文

* @param string 密文编码(base64/hex/bin)

* @param int 填充方式(貌似php有bug,所以目前仅支持OPENSSL_PKCS1_PADDING)

* @return string 密文

*/

public function encrypt($data, $code = base64, $padding = OPENSSL_PKCS1_PADDING){

$ret = false;

if (!$this->_checkPadding($padding, en)) $this->_error(padding error);

if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){

$ret = $this->_encode($result, $code);

}

return $ret;

}

/**

* 解密

*

* @param string 密文

* @param string 密文编码(base64/hex/bin)

* @param int 填充方式(OPENSSL_P