溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在php接口請(qǐng)求過(guò)程中實(shí)現(xiàn)一個(gè)AES加解密功能

發(fā)布時(shí)間:2021-01-14 15:25:30 來(lái)源:億速云 閱讀:170 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)如何在php接口請(qǐng)求過(guò)程中實(shí)現(xiàn)一個(gè)AES加解密功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

首先,準(zhǔn)備一個(gè)AES加解密的基礎(chǔ)類:

<?php

/**
 * 加密基礎(chǔ)類
 */

class Crypt_AES
{
  protected $_cipher = "rijndael-128";
  protected $_mode = "cbc";
  protected $_key;
  protected $_iv = null;
  protected $_descriptor = null;

  /**
   * 是否按照PKCS #7 的標(biāo)準(zhǔn)進(jìn)行填充
   * 為否默認(rèn)將填充“\0”補(bǔ)位
   * @var boolean
   */
  protected $_PKCS7 = false;

  /**
   * 構(gòu)造函數(shù),對(duì)于密鑰key應(yīng)區(qū)分2進(jìn)制字符串和16進(jìn)制的。
   * 如需兼容PKCS#7標(biāo)準(zhǔn),應(yīng)選項(xiàng)設(shè)置開啟PKCS7,默認(rèn)關(guān)閉
   * @param string $key 
   * @param mixed $iv   向量值
   * @param array $options
   */
  public function __construct($key = null, $iv = null, $options = null)
  {
    if (null !== $key) {
      $this->setKey($key);
    }

    if (null !== $iv) {
      $this->setIv($iv);
    }

    if (null !== $options) {
      if (isset($options['chipher'])) {
        $this->setCipher($options['chipher']);
      }

      if (isset($options['PKCS7'])) {
        $this->isPKCS7Padding($options['PKCS7']);
      }

      if (isset($options['mode'])) {
        $this->setMode($options['mode']);
      }
    }
  }

  /**
   * PKCS#7狀態(tài)查看,傳入Boolean值進(jìn)行設(shè)置
   * @param boolean $flag
   * @return boolean
   */
  public function isPKCS7Padding($flag = null)
  {
    if (null === $flag) {
      return $this->_PKCS7;
    }
    $this->_PKCS7 = (bool) $flag;
  }

  /**
   * 開啟加密算法
   * @param string $algorithm_directory locate the encryption 
   * @param string $mode_directory
   * @return Crypt_AES
   */
  public function _openMode($algorithm_directory = "" , $mode_directory = "") 
  {
    $this->_descriptor = mcrypt_module_open($this->_cipher, 
                        $algorithm_directory, 
                        $this->_mode,
                        $mode_directory);
    return $this;
  }

  public function getDescriptor()
  {
    if (null === $this->_descriptor) {
      $this->_openMode();
    }
    return $this->_descriptor;
  }

  protected function _genericInit()
  {
    return mcrypt_generic_init($this->getDescriptor(), $this->getKey(), $this->getIv());
  }

  protected function _genericDeinit()
  {
    return mcrypt_generic_deinit($this->getDescriptor());
  }

  public function getMode()
  {
    return $this->_mode;
  }
  
  public function setMode($mode)
  {
    $this->_mode = $mode;
    return $this;
  }

  public function getCipher()
  {
    return $this->_cipher;
  }
  
  public function setCipher($cipher)
  {
    $this->_cipher = $cipher;
    return $this;
  }  
  /**
   * 獲得key
   * @return string
   */
  public function getKey()
  {
    return $this->_key;
  }
  
  /**
   * 設(shè)置可以
   * @param string $key
   */
  public function setKey($key)
  {
    $this->_key = $key;
    return $this;
  }  


  /**
   * 獲得加密向量塊,如果其為null時(shí)將追加當(dāng)前Descriptor的IV大小長(zhǎng)度
   *
   * @return string
   */
  public function getIv()
  {
    if (null === $this->_iv && in_array($this->_mode, array( "cbc", "cfb", "ofb", ))) {
      $size = mcrypt_enc_get_iv_size($this->getDescriptor());
      $this->_iv = str_pad("", 16, "\0");
    }
    return $this->_iv;
  }

  /**
   * 獲得向量塊
   *
   * @param string $iv
   * @return Crypt_AES $this
   */
  public function setIv($iv)
  {
    $this->_iv = $iv;
    return $this;
  }  

  /**
   * 加密
   * @param string $str 被加密文本
   * @return string
   */
  public function encrypt($str){
    $td = $this->getDescriptor();
    $this->_genericInit();
    $bin = mcrypt_generic($td, $this->padding($str));
    $this->_genericDeinit();

    return $bin;
  }
 
  public function padding($dat)
  {
    if ($this->isPKCS7Padding()) {
      $block = mcrypt_enc_get_block_size($this->getDescriptor());
   
      $len = strlen($dat);
      $padding = $block - ($len % $block);
      $dat .= str_repeat(chr($padding),$padding);      
    }

    return $dat;
  }

  public function unpadding($str)
  {
    if ($this->isPKCS7Padding()) {
      $pad = ord($str[($len = strlen($str)) - 1]);
      $str = substr($str, 0, strlen($str) - $pad);
    }
    return $str;
  }

  /**
   * 解密
   * @param string $str 
   * @return string
   */
  public function decrypt($str){
    $td = $this->getDescriptor();

    $this->_genericInit();
    $text = mdecrypt_generic($td, $str);
    $this->_genericDeinit();

    return $this->unpadding($text);
  }
  
  /**
   * 16進(jìn)制轉(zhuǎn)成2進(jìn)制數(shù)據(jù)
   * @param string $hexdata 16進(jìn)制字符串
   * @return string
   */
  public static function hex2bin($hexdata) 
  {
    return pack("H*" , $hexdata);
  }

  /**
   * 字符串轉(zhuǎn)十六進(jìn)制
   * @param string $hexdata 16進(jìn)制字符串
   * @return string
   */
  public static function strToHex($string)
  {
    $hex='';
    for($i=0;$i<strlen($string);$i++)
      $hex.=dechex(ord($string[$i]));
    $hex=strtoupper($hex);
    return $hex;
  }

  /**
   * 十六進(jìn)制轉(zhuǎn)字符串
   * @param string $hexdata 16進(jìn)制字符串
   * @return string
   */
  function hexToStr($hex)
  {
    $string='';
    for($i=0;$i<strlen($hex)-1;$i+=2)
      $string.=chr(hexdec($hex[$i].$hex[$i+1]));
    return $string;
  }
}

客戶端請(qǐng)求部分:

<?php 

include 'AES.php';

$md5Key = 'ThisIsAMd5Key';               // 對(duì)應(yīng)服務(wù)端:$md5key = 'ThisIsAMd5Key';
$aesKey = Crypt_AES::strToHex('1qa2ws4rf3edzxcv');   // 對(duì)應(yīng)服務(wù)端:$aesKey = '3171613277733472663365647A786376';
$aesKey = Crypt_AES::hex2bin($aesKey);
$aesIV = Crypt_AES::strToHex('dfg452ws');       // 對(duì)應(yīng)服務(wù)端:$aesIV = '6466673435327773';
$aes = new Crypt_AES($aesKey,$aesIV,array('PKCS7'=>true, 'mode'=>'cbc'));

// var_dump($aes);

$data['name'] = 'idoubi';
$data['sex']= 'male';
$data['age'] = 23;
$data['signature'] = '白天我是一個(gè)程序員,晚上我就是一個(gè)有夢(mèng)想的演員。';

$content = base64_encode($aes->encrypt(json_encode($data)));
$content = urlencode($content);
$sign = md5($content.$md5Key);

$url = 'http://localhost/aesdemo/api.php';
$params = "version=1.0&sign=$sign&content=$content";

// 請(qǐng)求接口
post($url, $params);

/**
 * 接口請(qǐng)求函數(shù)
 */
function post($url, $params) {
  $curlPost= $params;
  $ch = curl_init();   //初始化curl
  curl_setopt($ch, CURLOPT_URL, $url);  //提交到指定網(wǎng)頁(yè)
  curl_setopt($ch, CURLOPT_HEADER, 0);  //設(shè)置header
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //要求結(jié)果為字符串且輸出到屏幕上
  curl_setopt($ch, CURLOPT_POST, 1);  //post提交方式
  curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
  $result = curl_exec($ch);//運(yùn)行curl
  curl_close($ch);
  var_dump(json_decode($result, true));
}

接口處理邏輯:

<?php 


include 'AES.php';

$data = $_POST; // 接口請(qǐng)求得到的數(shù)據(jù)
$content = $data['content'];
$sign = $data['sign'];

$aesKey = '3171613277733472663365647A786376';
$aesIV = '6466673435327773';
$md5key = 'ThisIsAMd5Key';

// 校驗(yàn)數(shù)據(jù)
if(strcasecmp(md5(urlencode($content).$md5key),$sign) == 0) {
  // 數(shù)據(jù)校驗(yàn)成功
  $key = Crypt_AES::hex2bin($aesKey);
  $aes = new Crypt_AES($key, $aesIV, array('PKCS7'=>true, 'mode'=>'cbc'));

  $decrypt = $aes->decrypt(base64_decode($content));
  if (!$decrypt) {   // 解密失敗
    echo json_encode('can not decrypt the data');
  } else {
    echo json_encode($decrypt);   // 解密成功
  }
} else{
  echo json_encode('data is not integrity');    // 數(shù)據(jù)校驗(yàn)失敗
}

上述接口請(qǐng)求過(guò)程中定義了三個(gè)加解密需要用到的參數(shù):$aesKey、$aesIV、$md5key,在實(shí)際應(yīng)用過(guò)程中,只要與客戶端用戶約定好這三個(gè)參數(shù),客戶端程序員利用這幾個(gè)參數(shù)對(duì)要請(qǐng)求的數(shù)據(jù)進(jìn)行加密后再請(qǐng)求接口,服務(wù)端程序員在接收到數(shù)據(jù)后利用同樣的加解密參數(shù)對(duì)數(shù)據(jù)進(jìn)行解密,整個(gè)api請(qǐng)求過(guò)程中的數(shù)據(jù)就很安全了。

關(guān)于如何在php接口請(qǐng)求過(guò)程中實(shí)現(xiàn)一個(gè)AES加解密功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI