ThinkPHP实现的rsa非对称加密类示例


Posted in PHP onMay 29, 2018

本文实例讲述了ThinkPHP实现的rsa非对称加密类。分享给大家供大家参考,具体如下:

公钥加密后的字符串是一直变化的,但是用私钥解密后的内容仍然是相同的,这是为了加密数据使用的。

私钥加密的字符串是不会变化的,即使暴露在外网上别人截取时如果没有公钥也是看不出来内容的,仅允许给予公钥的第三方来解密并看到内容,实际作用相当于签名功能,如果能拿到未加密的内容,说明一定是信任方的数据,因为有他的签名啊。

其实这种非对称加密技术可以用于单点登录中去,安全级别高,能解密获取到内容应该就是信任方的数据。

<?php
namespace Common\Org;
class RsaCrypt {
 const CERPATH ='../Application/Runtime/Data/server.cer'; //生成证书路径
 const PFXPATH = '../Application/Runtime/Data/server.pfx'; //秘钥文件路径
 const FILEDIR = '../Application/Runtime/Data/';
  /**
  * 生成公钥私钥
  */
  public static function generateCertKey()
  {
  $dn = array('countryName'=>'CN', 'stateOrProvinceName'=>'beijing', 'localityName'=>'beijing','organizationName'=>'clcw',
    'organizationalUnitName'=>'clcw', 'commonName'=>'clcw', 'emailAddress'=>'service@clcw.com.cn');
  $privkeypass = 'secret';  //私钥密码
  $numberOfDays = 365;   //有效时长,单位为天
  //生成证书
  $privkey = openssl_pkey_new();
  $csr = openssl_csr_new($dn, $privkey);
  $sscert = openssl_csr_sign($csr, null, $privkey, $numberOfDays);
  openssl_x509_export_to_file($sscert, self::CERPATH);
  openssl_pkcs12_export_to_file($sscert, self::PFXPATH, $privkey, $privkeypass);
  (file_exists(self::CERPATH)) or die('公钥的文件路径错误');
  (file_exists(self::PFXPATH)) or die('密钥的文件路径错误');
  }
  public static function verifyData($originData, $decryptData)
  {
  $cer_key = file_get_contents(self::$cerpath);
  $cer = openssl_x509_read($cer_key);
  $res = openssl_verify($originData, $decryptData, $cer);
  var_dump($res);
  }
  /**
  * 生成公钥私钥文件
  * @param $appName string 应用名称
  */
  public static function generateKey($appName='')
  {
  $result = ['status'=>0, 'msg'=>''];
  if (!extension_loaded('openssl') ) {
   $result['msg'] = 'php需要openssl支持';
  }
  //创建公钥
  $res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串
  //提取私钥
  openssl_pkey_export($res, $privatekey);
  //生成公钥
  $public_key = openssl_pkey_get_details($res);
  $publickey = $public_key['key'];
  // $path = self::FILEDIR.$appName;
  try{
   // file_put_contents($path.'_public.pem', $publickey);
   // file_put_contents($path.'_private.pem', $privatekey);
   $result['status'] = 1;
   $result['publickey'] = $publickey;
   $result['privatekey'] = $privatekey;
  }catch(\Exception $e) {
   // throw new \Exception($e->getMessage());
   $result['msg'] = $e->getMessage();
  }
  return $result;
  }
  /**
  * 用私钥加密数据
  * @param $data string 需要加密的字符串(最好不要超过200个字符)
  * @param $appName string 应用名称
  */
  public static function privateEncrypt($data, $appName)
  {
  $result = ['status'=>0, 'msg'=>''];
  $privatekey = C($appName.'.PRIVATE_KEY');
  $myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."\n";
  file_put_contents('/tmp/shiyf.log', $myinfo, FILE_APPEND);
  //生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
  $privatekey = openssl_pkey_get_private($privatekey);
  if (empty($privatekey)) {
   $result['msg'] = '密钥不可用';
  }
  $encryptData = '';
  //用私钥加密
  if (openssl_private_encrypt($data, $encryptData, $privatekey)) {
   $result['msg'] = base64_encode($encryptData);
   $result['status'] = 1;
  } else {
   $result['msg'] = '加密失败!';
  }
  return $result;
  }
  /**
  * 用公钥解密数据
  * @param $data string 需要解密的字符串(最好不要超过200个字符)
  * @param $appName string 应用名称
  */
  public static function publicDecrypt($data, $appName)
  {
  $result = ['status'=>0, 'msg'=>''];
  $data = base64_decode($data);
  $publickey = C($appName.'.PUBLIC_KEY');
  //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
  $publickey = openssl_pkey_get_public($publickey);
  if (empty($publickey)) {
   $result['msg'] = '公钥不可用';
  }
  //解密数据
  $decryptData = '';
  if (openssl_public_decrypt($data, $decryptData, $publickey)) {
   $result['msg'] = $decryptData;
   $result['status'] = 1;
  } else {
   $result['msg'] = '解密失败';
  }
  return $result;
  }
  /**
  * 用公钥加密数据
  * @param $data string 需要加密的字符串(最好不要超过200个字符)
  * @param $appName string 应用名称
  */
  public static function publicEncrypt($data, $publickey)
  {
  $result = ['status'=>0, 'msg'=>''];
  //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false
  $publickey = openssl_pkey_get_public($publickey);
  if (empty($publickey)) {
   $result['msg'] = '公钥不可用';
  }
  $encryptData = '';
  //用私钥加密
  if (openssl_public_encrypt($data, $encryptData, $publickey)) {
   $result['msg'] = base64_encode($encryptData);
   $result['status'] = 1;
  } else {
   $result['msg'] = '加密失败!';
  }
  return $result;
  }
  /**
  * 用私钥加密数据
  * @param $data string 需要解密的字符串(最好不要超过200个字符)
  * @param $appName string 应用名称
  */
  public static function privateDecrypt($data, $appName)
  {
  $result = ['status'=>0, 'msg'=>''];
  $data = base64_decode($data);
  $privatekey = C($appName.'.PRIVATE_KEY');
  //生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false
  $privatekey = openssl_pkey_get_private($privatekey);
  if (empty($privatekey)) {
   $result['msg'] = '私钥不可用';
  }
  //解密数据
  $decryptData = '';
  if (openssl_private_decrypt($data, $decryptData, $privatekey)) {
   $result['msg'] = $decryptData;
   $result['status'] = 1;
  } else {
   $result['msg'] = '解密失败';
  }
  return $result;
  }
}
PHP 相关文章推荐
php.ini中文版
Oct 09 PHP
建立文件交换功能的脚本(三)
Oct 09 PHP
php 获取可变函数参数的函数
Aug 26 PHP
PHP操作xml代码
Jun 17 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
php使用正则表达式进行字符串搜索的方法
Mar 23 PHP
php实现阳历阴历互转的方法
Oct 28 PHP
php中mkdir()函数的权限问题分析
Sep 24 PHP
PHP图像识别技术原理与实现
Oct 27 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
Oct 29 PHP
PHP反射机制原理与用法详解
Feb 15 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 #PHP
php实现表单提交上传文件功能
May 28 #PHP
PHP封装的非对称加密RSA算法示例
May 28 #PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 #PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 #PHP
PHP测试框架PHPUnit组织测试操作示例
May 28 #PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 #PHP
You might like
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
jQuery 使用手册(一)
2009/09/23 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
JavaScript获取移动设备型号的实现代码(JS获取手机型号和系统)
2018/03/10 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
mpvue实现微信小程序快递单号查询代码
2020/04/03 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
[01:33:59]真人秀《加油 DOTA》 第六期
2014/09/09 DOTA
python处理二进制数据的方法
2015/06/03 Python
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python实现字典嵌套列表取值
2019/12/16 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
世界顶级足球门票网站:Live Football Tickets
2017/10/14 全球购物
Charles & Colvard官网:美国莫桑石品牌
2019/06/05 全球购物
数据库专业英语
2012/11/30 面试题
保送生自荐信范文
2013/10/06 职场文书
最新自我评价范文
2013/11/16 职场文书
三好学生自我鉴定
2013/12/17 职场文书
校园演讲稿汇总
2014/05/21 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle