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 相关文章推荐
杏林同学录(七)
Oct 09 PHP
PHP开发中常用的三个表单验证函数使用小结
Mar 03 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
Nov 07 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
php读取文件内容到数组的方法
Mar 16 PHP
php读取csc文件并输出
May 21 PHP
PHP文件上传类实例详解
Apr 08 PHP
php mysql 封装类实例代码
Sep 18 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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
php实现分页工具类分享
2014/01/09 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
献爱心活动总结
2014/05/07 职场文书
党员干部一句话承诺
2014/05/30 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书
迎新生标语大全
2014/10/06 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
2014年工程工作总结
2014/11/25 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
音乐剧猫观后感
2015/06/04 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang