php rsa加密类,php实现RSA加密类实例

搜索热词

本文实例讲述了PHP实现RSA加密类。分享给大家供大家参考。具体分析如下:

通过openssl实现的签名、验签、非对称加解密,需要配合x.509证书(如crt和pem)文件使用。

由于各种原因,该类并不十分完善,欢迎各种测试!

PHP;">

_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,$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_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 = false){

$ret = false;

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

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

if ($data !== false){

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,$type){

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,$code){

switch (strtolower($code)){

case 'base64':

$data = base64_encode(''.$data);

break;

case 'hex':

$data = bin2hex($data);

break;

case 'bin':

default:

}

return $data;

}

private function _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;

}

private function _getPublicKey($file){

$key_content = $this->_readFile($file);

if ($key_content){

$this->pubKey = openssl_get_publickey($key_content);

}

}

private function _getPrivateKey($file){

$key_content = $this->_readFile($file);

if ($key_content){

$this->priKey = openssl_get_privatekey($key_content);

}

}

private function _readFile($file){

$ret = false;

if (!file_exists($file)){

$this->_error("The file {$file} is not exists");

} else {

$ret = file_get_contents($file);

}

return $ret;

}

private function _hex2bin($hex = false){

$ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i',$hex) ? pack("H*",$hex) : false;

return $ret;

}

}

测试demo:

PHP;">

PHP

header('Content-Type:text/html;Charset=utf-8;');

include "rsa.PHP";

echo '';

$a = isset($_GET['a']) ? $_GET['a'] : '测试123';

//

$pubfile = 'E:\ssl\cert\pwd.crt';

$prifile = 'E:\ssl\cert\pwd.pem';

$m = new RSA($pubfile,$prifile);

$x = $m->sign($a);

$y = $m->verify($a,$x);

var_dump($x,$y);

$x = $m->encrypt($a);

$y = $m->decrypt($x);

var_dump($x,$y);

希望本文所述对大家的PHP程序设计有所帮助。

总结

以上是编程之家为你收集整理的php实现RSA加密类实例全部内容,希望文章能够帮你解决php实现RSA加密类实例所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值