From 3780bc9feeb7578f7d98ec44e62e0dc5fb2921b5 Mon Sep 17 00:00:00 2001 From: dy <531014023@qq.com> Date: Mon, 22 Jan 2018 17:17:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSE b/LICENSE index 7f5405c..c5c4db6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ Apache License +这是改变 Version 2.0, January 2004 http://www.apache.org/licenses/ -- Gitee From 17cb4ee30baa642f59d1784caaef9f6175906f10 Mon Sep 17 00:00:00 2001 From: dy <531014023@qq.com> Date: Tue, 23 Jan 2018 13:52:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?RSA=E9=9D=9E=E5=AF=B9=E7=A7=B0=E5=8A=A0?= =?UTF-8?q?=E5=AF=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extend/rsa/RSA.php | 252 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 extend/rsa/RSA.php diff --git a/extend/rsa/RSA.php b/extend/rsa/RSA.php new file mode 100644 index 0000000..372a2c0 --- /dev/null +++ b/extend/rsa/RSA.php @@ -0,0 +1,252 @@ +encrypt("123");//加密 + * new \rsa\RSA('pri_key_path','pub_key_path')->decrypt("xxx");//解密 + * new \rsa\RSA('pri_key_path','pub_key_path')->sign("xxx");//签名 + * new \rsa\RSA('pri_key_path','pub_key_path')->verify("xxx");//验证签名 + * Class RSA + * @package rsa + */ +class RSA +{ + private $pubKey = null; + private $priKey = null; + + /** + * 构造函数 + * + * @param string $public_key_file 公钥文件(验签和加密时传入) + * @param string $private_key_file 私钥文件(签名和解密时传入) + */ + 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); + } + } + + // 私有方法 + /** + * 自定义错误处理 + */ + private function _error($msg) + { + die('RSA Error:' . $msg); //TODO + } + + /** + * 检测填充类型 + * 加密只支持PKCS1_PADDING + * 解密支持PKCS1_PADDING和NO_PADDING + * + * @param int $padding 填充模式 + * @param string $type 加密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(is_file($file)) { + if (!file_exists($file)) { + $this->_error("The file {$file} is not exists"); + } else { + $ret = file_get_contents($file); + } + }else{ + $ret = $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; + } + + /** + * 生成签名 + * + * @param string $data 签名材料 + * @param string $code 签名编码(base64/hex/bin) + * @return string 签名值 + */ + public function sign($data, $code = 'base64') + { + $ret = false; + if (openssl_sign($data, $ret, $this->priKey)) { + $ret = $this->_encode($ret, $code); + } + return $ret; + } + + /** + * 验证签名 + * + * @param string $data 签名材料 + * @param string $sign 签名值 + * @param string $code 签名编码(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 $data 明文 + * @param string $code 密文编码(base64/hex/bin) + * @param int $padding 填充方式(貌似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_private_encrypt($data, $result, $this->priKey, $padding)) { + $ret = $this->_encode($result, $code); + } + return $ret; + } + + /** + * 解密 + * + * @param string $data 密文 + * @param string $code 密文编码(base64/hex/bin) + * @param int $padding 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING) + * @param bool $rev 是否翻转明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block) + * @return string 明文 + */ + public function decrypt($data, $code = 'base64', $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_public_decrypt($data, $result, $this->pubKey, $padding)) { + $ret = $rev ? rtrim(strrev($result), "\0") : '' . $result; + } + } + return $ret; + } +} \ No newline at end of file -- Gitee