当前位置:首页 > CMS教程 > Thinkphp > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-09-20 15:55:50 浏览: 评论:0 

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

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

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

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

  1. <?php 
  2. namespace Common\Org; 
  3. class RsaCrypt { 
  4.  const CERPATH ='../Application/Runtime/Data/server.cer'//生成证书路径 
  5.  const PFXPATH = '../Application/Runtime/Data/server.pfx'//秘钥文件路径 
  6.  const FILEDIR = '../Application/Runtime/Data/'
  7.   /** 
  8.   * 生成公钥私钥 
  9.   */ 
  10.   public static function generateCertKey() 
  11.   { 
  12.   $dn = array('countryName'=>'CN''stateOrProvinceName'=>'beijing''localityName'=>'beijing','organizationName'=>'clcw'
  13.     'organizationalUnitName'=>'clcw''commonName'=>'clcw''emailAddress'=>'service@clcw.com.cn'); 
  14.   $privkeypass = 'secret';  //私钥密码 
  15.   $numberOfDays = 365;   //有效时长,单位为天 
  16.   //生成证书 
  17.   $privkey = openssl_pkey_new(); 
  18.   $csr = openssl_csr_new($dn$privkey); 
  19.   $sscert = openssl_csr_sign($csr, null, $privkey$numberOfDays); 
  20.   openssl_x509_export_to_file($sscert, self::CERPATH); 
  21.   openssl_pkcs12_export_to_file($sscert, self::PFXPATH, $privkey$privkeypass); 
  22.   (file_exists(self::CERPATH)) or die('公钥的文件路径错误'); 
  23.   (file_exists(self::PFXPATH)) or die('密钥的文件路径错误'); 
  24.   } 
  25.   public static function verifyData($originData$decryptData
  26.   { 
  27.   $cer_key = file_get_contents(self::$cerpath); 
  28.   $cer = openssl_x509_read($cer_key); 
  29.   $res = openssl_verify($originData$decryptData$cer); 
  30.   var_dump($res); 
  31.   } 
  32.   /** 
  33.   * 生成公钥私钥文件 
  34.   * @param $appName string 应用名称 
  35.   */ 
  36.   public static function generateKey($appName=''
  37.   { 
  38.   $result = ['status'=>0, 'msg'=>'']; 
  39.   if (!extension_loaded('openssl') ) { 
  40.    $result['msg'] = 'php需要openssl支持'
  41.   } 
  42.   //创建公钥 
  43.   $res = openssl_pkey_new();//array('private_key_bits'=>512) 这一串参数不加,否则只能加密54个长度的字符串 
  44.   //提取私钥 
  45.   openssl_pkey_export($res$privatekey); 
  46.   //生成公钥 
  47.   $public_key = openssl_pkey_get_details($res); 
  48.   $publickey = $public_key['key']; 
  49.   // $path = self::FILEDIR.$appName; 
  50.   try{ 
  51.    // file_put_contents($path.'_public.pem', $publickey); 
  52.    // file_put_contents($path.'_private.pem', $privatekey); 
  53.    $result['status'] = 1; 
  54.    $result['publickey'] = $publickey
  55.    $result['privatekey'] = $privatekey
  56.   }catch(\Exception $e) { 
  57.    // throw new \Exception($e->getMessage()); 
  58.    $result['msg'] = $e->getMessage(); 
  59.   } 
  60.   return $result
  61.   } 
  62.   /** 
  63.   * 用私钥加密数据 
  64.   * @param $data string 需要加密的字符串(最好不要超过200个字符) 
  65.   * @param $appName string 应用名称 
  66.   */ 
  67.   public static function privateEncrypt($data$appName
  68.   { 
  69.   $result = ['status'=>0, 'msg'=>'']; 
  70.   $privatekey = C($appName.'.PRIVATE_KEY'); 
  71.   $myinfo = 'In '.__METHOD__.',privatekey:'.$privatekey."\n"
  72.   file_put_contents('/tmp/shiyf.log'$myinfo, FILE_APPEND); 
  73.   //生成resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false 
  74.   $privatekey = openssl_pkey_get_private($privatekey); 
  75.   if (emptyempty($privatekey)) { 
  76.    $result['msg'] = '密钥不可用'
  77.   } 
  78.   $encryptData = ''
  79.   //用私钥加密 
  80.   if (openssl_private_encrypt($data$encryptData$privatekey)) { 
  81.    $result['msg'] = base64_encode($encryptData); 
  82.    $result['status'] = 1; 
  83.   } else { 
  84.    $result['msg'] = '加密失败!'
  85.   } 
  86.   return $result
  87.   } 
  88.   /** 
  89.   * 用公钥解密数据 
  90.   * @param $data string 需要解密的字符串(最好不要超过200个字符) 
  91.   * @param $appName string 应用名称 
  92.   */ 
  93.   public static function publicDecrypt($data$appName
  94.   { 
  95.   $result = ['status'=>0, 'msg'=>'']; 
  96.   $data = base64_decode($data); 
  97.   $publickey = C($appName.'.PUBLIC_KEY'); 
  98.   //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false 
  99.   $publickey = openssl_pkey_get_public($publickey); 
  100.   if (emptyempty($publickey)) { 
  101.    $result['msg'] = '公钥不可用'
  102.   } 
  103.   //解密数据 
  104.   $decryptData = ''
  105.   if (openssl_public_decrypt($data$decryptData$publickey)) { 
  106.    $result['msg'] = $decryptData
  107.    $result['status'] = 1; 
  108.   } else { 
  109.    $result['msg'] = '解密失败'
  110.   } 
  111.   return $result
  112.   } 
  113.   /** 
  114.   * 用公钥加密数据 
  115.   * @param $data string 需要加密的字符串(最好不要超过200个字符) 
  116.   * @param $appName string 应用名称 
  117.   */ 
  118.   public static function publicEncrypt($data$publickey
  119.   { 
  120.   $result = ['status'=>0, 'msg'=>'']; 
  121.   //生成resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_private函数返回false 
  122.   $publickey = openssl_pkey_get_public($publickey); 
  123.   if (emptyempty($publickey)) { 
  124.    $result['msg'] = '公钥不可用'
  125.   } 
  126.   $encryptData = ''
  127.   //用私钥加密 
  128.   if (openssl_public_encrypt($data$encryptData$publickey)) { 
  129.    $result['msg'] = base64_encode($encryptData); 
  130.    $result['status'] = 1; 
  131.   } else { 
  132.    $result['msg'] = '加密失败!'
  133.   } 
  134.   return $result
  135.   } 
  136.   /** 
  137.   * 用私钥加密数据 
  138.   * @param $data string 需要解密的字符串(最好不要超过200个字符) 
  139.   * @param $appName string 应用名称 
  140.   */ 
  141.   public static function privateDecrypt($data$appName
  142.   { 
  143.   $result = ['status'=>0, 'msg'=>'']; 
  144.   $data = base64_decode($data); 
  145.   $privatekey = C($appName.'.PRIVATE_KEY'); 
  146.   //生成resource类型的私钥,如果私钥文件内容被破坏,openssl_pkey_get_public函数返回false 
  147.   $privatekey = openssl_pkey_get_private($privatekey); 
  148.   if (emptyempty($privatekey)) { 
  149.    $result['msg'] = '私钥不可用'
  150.   } 
  151.   //解密数据 
  152.   $decryptData = ''
  153.   if (openssl_private_decrypt($data$decryptData$privatekey)) { 
  154.    $result['msg'] = $decryptData
  155.    $result['status'] = 1; 
  156.   } else { 
  157.    $result['msg'] = '解密失败'
  158.   } 
  159.   return $result
  160.   } 
  161. }

Tags: ThinkPHP加密类 rsa

分享到: