pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

PHP的RSA加密解密方法以及開發接口使用

本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。

網絡安全問題很重要,尤其是保證數據安全,遇到很多在寫接口的程序員直接都是明文數據傳輸,在我看來這是很不專業的。本人提倡經過接口的數據都要進行加密解密之后進行使用。

這篇文章主要介紹使用PHP開發接口,數據實現RSA加密解密后使用,實例分析了PHP自定義RSA類實現加密與解密的技巧,非常具有實用價值,需要的朋友可以參考下。

簡單介紹RSA

RSA加密算法是最常用的非對稱加密算法,CFCA在證書服務中離不了它。但是有不少新手對它不太了解。下面僅作簡要介紹。RSA是第一個比較完善的公開密鑰算法,它既能用于加密,也能用于數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定RSA的安全性,但這恰恰說明該算法有一定的可信性,目前它已經成為最流行的公開密鑰算法。RSA的安全基于大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價于分解兩個大素數之積(這是公認的數學難題)。

下面為具體類、實例:

<?php 
 
/** 
 * RSA算法類 
 * 簽名及密文編碼:base64字符串/十六進制字符串/二進制字符串流 
 * 填充方式: PKCS1Padding(加解密)/NOPadding(解密) 
 * 
 * Notice:Only accepts a single block. Block size is equal to the RSA key size! 
 * 如密鑰長度為1024 bit,則加密時數據需小于128字節,加上PKCS1Padding本身的11字節信息,所以明文需小于117字節 
 * 
 * @author: ZHIHUA_WEI 
 * @version: 1.0.0 
 * @date: 2017/06/30 
 */ 
class RSA 
{ 
  private $pubKey = null; 
  private $priKey = null; 
 
  /** 
   * 構造函數 
   * 
   * @param string 公鑰文件(驗簽和加密時傳入) 
   * @param string 私鑰文件(簽名和解密時傳入) 
   */ 
  public function __construct($public_key_file = '', $private_key_file = '') 
  { 
    if ($public_key_file) { 
      $this->_getPublicKey($public_key_file); 
    } 
    if ($private_key_file) { 
      $this->_getPrivateKey($private_key_file); 
    } 
  } 
 
  // 私有方法 
  /** 
   * 自定義錯誤處理 
   */ 
  private function _error($msg) 
  { 
    die('RSA Error:' . $msg); //TODO 
  } 
 
  /** 
   * 檢測填充類型 
   * 加密只支持PKCS1_PADDING 
   * 解密支持PKCS1_PADDING和NO_PADDING 
   * 
   * @param int 填充模式 
   * @param string 加密en/解密de 
   * @return bool 
   */ 
  private function _checkPadding($padding, $type) 
  { 
    if ($type == 'en') { 
      switch ($padding) { 
        case OPENSSL_PKCS1_PADDING: 
          $ret = true; 
          break; 
        default: 
          $ret = false; 
      } 
    } else { 
      switch ($padding) { 
        case OPENSSL_PKCS1_PADDING: 
        case OPENSSL_NO_PADDING: 
          $ret = true; 
          break; 
        default: 
          $ret = false; 
      } 
    } 
    return $ret; 
  } 
 
  private function _encode($data, $code) 
  { 
    switch (strtolower($code)) { 
      case 'base64': 
        $data = base64_encode('' . $data); 
        break; 
      case 'hex': 
        $data = bin2hex($data); 
        break; 
      case 'bin': 
      default: 
    } 
    return $data; 
  } 
 
  private function _decode($data, $code) 
  { 
    switch (strtolower($code)) { 
      case 'base64': 
        $data = base64_decode($data); 
        break; 
      case 'hex': 
        $data = $this->_hex2bin($data); 
        break; 
      case 'bin': 
      default: 
    } 
    return $data; 
  } 
 
  private function _getPublicKey($file) 
  { 
    $key_content = $this->_readFile($file); 
    if ($key_content) { 
      $this->pubKey = openssl_get_publickey($key_content); 
    } 
  } 
 
  private function _getPrivateKey($file) 
  { 
    $key_content = $this->_readFile($file); 
    if ($key_content) { 
      $this->priKey = openssl_get_privatekey($key_content); 
    } 
  } 
 
  private function _readFile($file) 
  { 
    $ret = false; 
    if (!file_exists($file)) { 
      $this->_error("The file {$file} is not exists"); 
    } else { 
      $ret = file_get_contents($file); 
    } 
    return $ret; 
  } 
 
  private function _hex2bin($hex = false) 
  { 
    $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false; 
    return $ret; 
  } 
 
  /** 
   * 生成簽名 
   * 
   * @param string 簽名材料 
   * @param string 簽名編碼(base64/hex/bin) 
   * @return 簽名值 
   */ 
  public function sign($data, $code = 'base64') 
  { 
    $ret = false; 
    if (openssl_sign($data, $ret, $this->priKey)) { 
      $ret = $this->_encode($ret, $code); 
    } 
    return $ret; 
  } 
 
  /** 
   * 驗證簽名 
   * 
   * @param string 簽名材料 
   * @param string 簽名值 
   * @param string 簽名編碼(base64/hex/bin) 
   * @return bool 
   */ 
  public function verify($data, $sign, $code = 'base64') 
  { 
    $ret = false; 
    $sign = $this->_decode($sign, $code); 
    if ($sign !== false) { 
      switch (openssl_verify($data, $sign, $this->pubKey)) { 
        case 1: 
          $ret = true; 
          break; 
        case 0: 
        case -1: 
        default: 
          $ret = false; 
      } 
    } 
    return $ret; 
  } 
 
  /** 
   * 加密 
   * 
   * @param string 明文 
   * @param string 密文編碼(base64/hex/bin) 
   * @param int 填充方式(貌似php有bug,所以目前僅支持OPENSSL_PKCS1_PADDING) 
   * @return string 密文 
   */ 
  public function encrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING) 
  { 
    $ret = false; 
    if (!$this->_checkPadding($padding, 'en')) $this->_error('padding error'); 
    if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)) { 
      $ret = $this->_encode($result, $code); 
    } 
    return $ret; 
  } 
 
  /** 
   * 解密 
   * 
   * @param string 密文 
   * @param string 密文編碼(base64/hex/bin) 
   * @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING) 
   * @param bool 是否翻轉明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block) 
   * @return string 明文 
   */ 
  public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false) 
  { 
    $ret = false; 
    $data = $this->_decode($data, $code); 
    if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error'); 
    if ($data !== false) { 
      if (openssl_private_decrypt($data, $result, $this->priKey, $padding)) { 
        $ret = $rev ? rtrim(strrev($result), "\0") : '' . $result; 
      } 
    } 
    return $ret; 
  } 
} 
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要為大家詳細介紹了搜索附近的人PHP實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 汕头市盛大文化传播有限公司,www.11400.cc | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 砂尘试验箱_淋雨试验房_冰水冲击试验箱_IPX9K淋雨试验箱_广州岳信试验设备有限公司 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | 蜂窝块状沸石分子筛-吸附脱硫分子筛-萍乡市捷龙环保科技有限公司 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 广州展览设计公司_展台设计搭建_展位设计装修公司-众派展览装饰 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 考勤系统_人事考勤管理系统_本地部署BS考勤系统_考勤软件_天时考勤管理专家 | 广东之窗网 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 手术室净化厂家_成都实验室装修公司_无尘车间施工单位_洁净室工程建设团队-四川华锐16年行业经验 | 气动调节阀,电动调节阀,自力式压力调节阀,切断阀「厂家」-浙江利沃夫自控阀门 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 2-羟基泽兰内酯-乙酰蒲公英萜醇-甘草查尔酮A-上海纯优生物科技有限公司 | 电力测功机,电涡流测功机,磁粉制动器,南通远辰曳引机测试台 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 2025第九届世界无人机大会| 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 氢氧化钙设备_厂家-淄博工贸有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 | 列管冷凝器,刮板蒸发器,外盘管反应釜厂家-无锡曼旺化工设备有限公司 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 找培训机构_找学习课程_励普教育 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 识禅_对禅的了解,从这里开始 | 北京浩云律师事务所-企业法律顾问_破产清算等公司法律服务 |