linux生成公钥和私钥及php服务器签名验证

php admin 2746℃ 1评论

生成公钥和私钥及php签名验证

 

openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,

第二条命令将原始 RSA私钥转换为 pkcs8格式【可以不用】,

第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给Android跟ios等前端

baseSign.php

<?php
namespace plugin\rsa;

/**
* Created by PhpStorm.
* User: ykuang
* Date: 2016/8/11
* Time: 16:50
*/
class BaseSign
{
   /**获取公钥加密签名
    * @param $data
    * @return mixed
    */
   public static function  rsa_publickey_encrypt($publicKey, $data)
   {
       $pubk = openssl_get_publickey($publicKey);
       openssl_public_encrypt($data, $encrypt, $pubk, OPENSSL_PKCS1_PADDING);
       return $encrypt;
   }

   /**私钥解密
    * @param $data
    * @return mixed
    */
   public static function rsa_privatekey_decrypt($priKey, $data)
   {
       $prik = openssl_get_privatekey($priKey);
       openssl_private_decrypt($data, $decrypt, $prik, OPENSSL_PKCS1_PADDING);
       return $decrypt;
   }

   /**数据长度过长 公钥加密
    * @param $data
    * @param $public_key_path
    * @param int $rsa_bit
    * @return string
    */
   public static function rsa_encrypt($data, $public_key_path, $rsa_bit = 1024)
   {
       $publicKey = file_get_contents($public_key_path);
       $inputLen = strlen($data);
       $offSet = 0;
       $i = 0;
       $maxDecryptBlock = $rsa_bit / 8 - 11;
       $encrypt = '';
       // 对数据分段加密
       while ($inputLen - $offSet > 0) {
           if ($inputLen - $offSet > $maxDecryptBlock) {
               $cache = self::rsa_publickey_encrypt($publicKey, substr($data, $offSet, $maxDecryptBlock));
           } else {
               $cache = self::rsa_publickey_encrypt($publicKey, substr($data, $offSet, $inputLen - $offSet));
           }
           $encrypt = $encrypt . $cache;
           $i++;
           $offSet = $i * $maxDecryptBlock;
       }
       return $encrypt ? base64_encode($encrypt) : $encrypt;
   }

   /**数据过长私钥解密
    * @param $sign
    * @param $private_key_path
    * @param int $rsa_bit
    * @return string
    */
   public static function rsa_decrypt($sign, $private_key_path, $rsa_bit = 1024)
   {
       $data = base64_decode($sign);
       $priKey = file_get_contents($private_key_path);
       $inputLen = strlen($sign);
       $offSet = 0;
       $i = 0;
       $maxDecryptBlock = $rsa_bit / 8;
       $decrypt = '';
       $cache = '';
       // 对数据分段解密
       while ($inputLen - $offSet > 0) {
           if ($inputLen - $offSet > $maxDecryptBlock) {
               $cache = self::rsa_privatekey_decrypt($priKey, substr($data, $offSet, $maxDecryptBlock));
           } else {
               $cache = self::rsa_privatekey_decrypt($priKey, substr($data, $offSet, $inputLen - $offSet));
           }
           $decrypt = $decrypt . $cache;
           $i = $i + 1;
           $offSet = $i * $maxDecryptBlock;
       }
       return $decrypt;
   }

   /**生成签名前字符串
    * @param $data
    * @return string
    */
   public static function createStr($data)
   {
       $str = "";
       if (is_array($data) || strpos($data, '&')) {
           if (is_string($data) && strpos($data, '&')) {
               $temp_data = explode('&', $data);
               $data = [];
               foreach ($temp_data as $item) {
                   $temp = explode('=', $item);
                   $data[$temp[0]] = $temp[1];
               }
           }
           $data = self::argSort($data);
           //  var_dump($data);exit;
           $temp = [];
           foreach ($data as $k => $item) {
               $temp[] = $k . '=' . $item;
           }
           $str = implode('&', $temp);
       } else {
           $str = $data;
       }
       return $str;
   }

   /**获取解析签名后数组
    * @param $private_key_path
    * @param $sign
    * @return array|bool
    */
   public static function getSignArr($private_key_path, $sign)
   {
       $result = self::rsa_decrypt($sign, $private_key_path);
       if ($result) {
           $data = [];
           $temp_data = explode('&', $result);
           foreach ($temp_data as $item) {
               $temp = explode('=', $item);
               $data[$temp[0]] = $temp[1];
           }
           return $data;
       }
       return false;
       // return $result;
   }

   /**获取解析签名后字符串
    * @param $private_key_path
    * @param $sign
    * @return array|bool
    */
   public static function getSignStr($private_key_path, $sign)
   {
       $result = self::rsa_decrypt($sign, $private_key_path);
       if ($result) {
           return $result;
       }
       return false;
       // return $result;
   }

   /**对数组排序
    * @param $para
    * @return mixed
    */
   public static function argSort($para)
   {
       ksort($para);
       reset($para);
       return $para;
   }
}

Sign.php


<?php
namespace plugin\rsa\app\lib;

use Library\Core\Debug;
use plugin\rsa\BaseSign;

/**
* Created by PhpStorm.
* User: luguiwu
* Date: 2016/6/28
* Time: 11:25
*/
class Sign extends BaseSign
{
   /**RSA签名
    * $data待签名数据
    * 签名用私钥,必须是没有经过pkcs8转换的私钥
    * 最后的签名,需要用base64编码
    * return Sign签名
    */
   /*  public static function sign($data)
     {
         $sign= parent::rsa_encrypt($data,WEB_ROOT . '/plugin/rsa/app/key/rsa_private_key.pem');
         return $sign;
     }*/

   /**公钥加密
    * @param $data
    * @return string
    */
   public static function publicSign($data)
   {
       $sign = parent::rsa_encrypt($data, WEB_ROOT . '/plugin/rsa/app/key/rsa_public_key.pem');
       return $sign;
   }

   public static function signArr($sign)
   {
       return parent::getSignArr(WEB_ROOT . '/plugin/rsa/app/key/private_key.pem', $sign);
   }
   public static function signStr($sign)
   {
       return parent::getSignStr(WEB_ROOT . '/plugin/rsa/app/key/private_key.pem', $sign);
   }
   /**私钥验签
    * @param $prestr
    * @param $sign
    * @return bool
    */
   public static function privateRsaVerify($prestr, $sign)
   {
       $result = parent::rsa_decrypt($sign, WEB_ROOT . '/plugin/rsa/app/key/private_key.pem');
       Debug::log("RSA decrypt:" . $result, 'sign');
       if ($result && $result == $prestr) {
           return true;
       }
       return false;
   }

}


加载中...