• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    ThinkPHP实现的rsa非对称加密类示例

    本文实例讲述了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;
      }
    }
    
    

    PS:关于加密解密感兴趣的朋友还可以参考本站在线工具:

    在线RSA加密/解密工具:
    http://tools.jb51.net/password/rsa_encode

    文字在线加密解密工具(包含AES、DES、RC4等):
    http://tools.jb51.net/password/txt_encode

    在线散列/哈希算法加密工具:
    http://tools.jb51.net/password/hash_encrypt

    在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
    http://tools.jb51.net/password/hash_md5_sha

    在线sha1/sha224/sha256/sha384/sha512加密工具:
    http://tools.jb51.net/password/sha_encode

    更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

    希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • 浅谈PHP SHA1withRSA加密生成签名及验签
    • PHP7.1实现的AES与RSA加密操作示例
    • PHP封装的非对称加密RSA算法示例
    • 基于PHP RSA密文过长加密解密 越过1024的解决方法
    • PHP实现RSA加解密算法示例(生成密钥位数为1024位的方法)
    • PHP的RSA加密解密方法以及开发接口使用
    • PHP检测接口Traversable用法详解
    • PHP实现的MD5结合RSA签名算法实例
    • PHP实现RSA签名生成订单功能【支付宝示例】
    • php rsa 加密,解密,签名,验签详解
    • php基于openssl的rsa加密解密示例
    • PHP rsa加密解密使用方法
    • php实现RSA加密类实例
    • 详解PHP使用非对称加密算法RSA
    上一篇:PHP中实现中文字串截取无乱码的解决方法
    下一篇:在Laravel中使用DataTables插件的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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