php;">
_getPublicKey($public_key_fil
E);
}
if ($private_key_fil
E){
$this->_getPrivateKey($private_key_fil
E);
}
}
/
**
* 生成签名
*
* @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,$cod
E);
}
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,$cod
E);
if ($sign
!==
fals
E) {
switch (openssl_verify($data,$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,$cod
E);
}
return $ret;
}
/
**
* 解密
*
* @param
String 密文
* @param
String 密文编码(base64/hex/bin)
* @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)
* @param bool 是否翻转明文(When passing Microsoft CryptoAPI-generated RSA cyphertext,revert the bytes in the block)
* @return
String 明文
*/
public function decrypt($data,$padding = OPENSSL_PKCS1_PADDING,$rev =
fals
E){
$ret =
false;
$data = $this->_decode($data,$cod
E);
if (!$this->_
checkPadding($padding,'de')) $this->_error('padding error'
);
if ($data
!==
fals
E){
if (openssl_private_decrypt($data,$this->priKey,$padding))
{
$ret = $rev ?
rtrim(strrev($result),"\0") : ''.$result;
}
}
return $ret;
}
// 私有方法
/
**
* 检测填充类型
* 加密只支持PKCS1_PADDING
* 解密支持PKCS1_PADDING和NO_PADDING
*
* @param int 填充模式
* @param
String 加密en/解密de
* @return bool
*/
private function _
checkPadding($padding,$typ
E){
if ($type == 'en')
{
switch ($padding)
{
case OPENSSL_PKCS1_PADDING:
$ret = true;
break;
default:
$ret =
false;
}
} else
{
switch ($padding)
{
case OPENSSL_PKCS1_PADDING:
case OPENSSL_NO_PADDING:
$ret = true;
break;
default:
$ret =
false;
}
}
return $ret;
}
private function _encode($data,$cod
E){
switch (strtolower($cod
E))
{
case 'base64':
$data = base64_encode(''.$data
);
break;
case 'hex':
$data = bin2hex($data
);
break;
case 'bin':
default:
}
return $data;
}
private function _decode($data,$cod
E){
switch (strtolower($cod
E))
{
case 'base64':
$data = base64_decode($data
);
break;
case 'hex':
$data = $this->_hex2bin($data
);
break;
case 'bin':
default:
}
return $data;
}
private function _getPublicKey($fil
E){
$key_content = $this->_readFile($fil
E);
if ($key_content)
{
$this->pubKey = openssl_get_publickey($key_content
);
}
}
private function _getPrivateKey($fil
E){
$key_content = $this->_readFile($fil
E);
if ($key_content)
{
$this->priKey = openssl_get_privatekey($key_content
);
}
}
private function _readFile($fil
E){
$ret =
false;
if (!file_exists($fil
E))
{
$this->_error("The file
{$fil
E} is not exists"
);
} else
{
$ret = file_get_contents($fil
E);
}
return $ret;
}
private function _hex2bin($hex =
fals
E){
$ret = $hex
!==
false && preg_match('/^[
0-9a-fA-F]+$/i',$he
X) ? pack("H*",$he
X) :
false;
return $ret;
}
}