加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP如何实现AES加密、解密?方法详解

发布时间:2022-07-21 14:09:35 所属栏目:PHP教程 来源:互联网
导读:1、mcrypt_encrypt AES加密,解密 * 构造,传递二个已经进行base64_encode的KEY与IV * * @param string $key * @param string $iv */ function __construct ($key, $iv) { if (empty($key) || empty($iv)) { echo key and iv is not valid; exit(); pt ($val
  1、mcrypt_encrypt AES加密,解密
 
 
      * 构造,传递二个已经进行base64_encode的KEY与IV
 
      *
 
      * @param string $key
 
      * @param string $iv
 
      */
 
      function __construct ($key, $iv)
 
      {
 
          if (empty($key) || empty($iv)) {
 
              echo 'key and iv is not valid';
 
              exit();
 pt ($value)
 
      {
 
          $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
 
          $iv = base64_decode($this->iv);
 
          $value = $this->PaddingPKCS7($value);
 
          $key = base64_decode($this->key);
 
          mcrypt_generic_init($td, $key, $iv);
 
 value
 
      * @return <type>
 
      */
 
      public function decrypt ($value)
 
      {
 
          $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
 
          $iv = base64_decode($this->iv);
 
          $key = base64_decode($this->key);
 
          mcrypt_generic_init($td, $key, $iv);
 
          $ret = trim(mdecrypt_generic($td, base64_decode($value)));
 
          $ret = $this->UnPaddingPKCS7($ret);
 
          mcrypt_generic_deinit($td);
 
          mcrypt_module_close($td);
 
          return $ret;
 
      }
 
   
 
      private function PaddingPKCS7 ($data)
 
      {
 
          $block_size = mcrypt_get_block_size('tripledes', 'cbc');
 
          $padding_char = $block_size - (strlen($data) % $block_size);
 
          $data .= str_repeat(chr($padding_char), $padding_char);
 
          return $data;
 
      }
 
   
 
      private function UnPaddingPKCS7($text)
 
      {
 
          $pad = ord($text{strlen($text) - 1});
 
          if ($pad > strlen($text)) {
 
              return false;
 
          }
 
          if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
 
              return false;
 
          }
 
          return substr($text, 0, - 1 * $pad);
 
      }
 
  }
 
  2、openssl 加密,解密 [方式1]
 
 
 
  /**
 
   * DES加密类
 
   * User: gaowei
 
   * Date: 2017/12/12
 
   * Time: 19:23
 
 
       */
 
      function __construct ($key, $iv)
 
      {
 
          if (empty($key) || empty($iv)) {
 
              echo 'key and iv is not valid';
 
              exit();
 
          }
 
          $this->key = $key;
 
          $this->iv = $iv;//8
 
          //$this->iv = $iv.'00000000000';//16
 
      public function encrypt ($value) {
 
   
 
          //参考地址:https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl-encrypt-and-openssl-zero-padding-problems#
 
          $value = $this->PaddingPKCS7($value);
 
          $key = base64_decode($this->key);
 
          $iv  = base64_decode($this->iv);
 
          //AES-128-ECB|不能用 AES-256-CBC|16 AES-128-CBC|16 BF-CBC|8 aes-128-gcm|需要加$tag  DES-EDE3-CBC|8
 
          $cipher = "DES-EDE3-CBC";
 
          if (in_array($cipher, openssl_get_cipher_methods())) {
 
              //$ivlen = openssl_cipher_iv_length($cipher);
 
             // $iv = openssl_random_pseudo_bytes($ivlen);
 
              $result = openssl_encrypt($value, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
 
              //$result = base64_encode($result); //为3的时间要用
 
              //store $cipher, $iv, and $tag for decryption later
 
             /* $original_plaintext = openssl_decrypt($result, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
 
              echo $original_plaintext."n";*/
 
 
       * @title 解密
 
       * @author gaowei
 
       * @date 2017/12/18
 
       * @param string $value 要传的参数
 
       * @return json
 
       * */
 
      public function decrypt ($value) {
 
          $key       = base64_decode($this->key);
 
          $iv        = base64_decode($this->iv);
 
          $decrypted = openssl_decrypt($value, 'DES-EDE3-CBC', $key, OPENSSL_SSLV23_PADDING, $iv);
 
          $ret = $this->UnPaddingPKCS7($decrypted);
 
          return $ret;
 
      }
 
   
 
      private function PaddingPKCS7 ($data) {
 
          //$block_size = mcrypt_get_block_size('tripledes', 'cbc');//获取长度
 
          //$block_size = openssl_cipher_iv_length('tripledes', 'cbc');//获取长度
 
          $block_size = 8;
 
          $padding_char = $block_size - (strlen($data) % $block_size);
 
          $data .= str_repeat(chr($padding_char), $padding_char);
 
          return $data;
 
      }
 
      private function UnPaddingPKCS7($text) {
 
          $pad = ord($text{strlen($text) - 1});
 
          if ($pad > strlen($text)) {
 
              return false;
 
          }
 
          if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
 
              return false;
 
          }
 
          return substr($text, 0, - 1 * $pad);
 
      }
 
  }
 
  3、openssl 加密,解密 [方式2]
 
 
   * @desc:php aes加密解密类
 
   * @author gl
 
   * @date 2019/08/31
 
   */
 
  class CI_Aes{
 
      /**
 
       * CI_Aes cipher
 
       * @var string
 
       */
 
      protected $cipher = 'aes-128-ecb';
 
      /**
 
       * CI_Aes key
 
       *
 
       * @var string
 
       */
 
      protected $key;
 
      /**
 
       * CI_Aes constructor
 
       * @param string $key Configuration parameter
 
       */
 
   
 
      public function __construct($key=null){
 
          $this->key = $key;
 
      }
 
   
 
      /**
 
       * Initialize
 
       *
 
       * @param array $params Configuration parameters
 
       * @return CI_Encryption
 
       */
 
      public function initialize($params)
 
      {
 
          if (!empty($params) && is_array($params)) {
 
              foreach ($params as $key => $val) {
 
                  $this->$key = $val;
 
              }
 
          }
 
      }
 
      /**
 
       * Encrypt
 
       *
 
       * @param string $data Input data
 
       * @return string
 
       */
 
      public function encrypt($data) {
 
          $endata =  openssl_encrypt($data, $this->cipher, $this->key, OPENSSL_RAW_DATA);
 
          return  bin2hex($endata);
 
      }
 
   
 
      /**
 
       * Decrypt
 
       *
 
       * @param string $data Encrypted data
 
       * @return string
 
       */
 
      public function decrypt($data) {
 
          $encrypted = hex2bin($data);
 
          return openssl_decrypt($encrypted, $this->cipher, $this->key, OPENSSL_RAW_DATA);
 
      }
 
   
 
  }
 
  4、其他 加密,解密
 
 
  //加密函数
 
  function lock_url($txt,$key='www.jb51.net')
 
  {
 
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
 
    $nh = rand(0,64);
 
    $ch = $chars[$nh];
 
    $mdKey = md5($key.$ch);
 
    $mdKey = substr($mdKey,$nh%8, $nh%8+7);
 
    $txt = base64_encode($txt);
 
    $tmp = '';
 
    $i=0;$j=0;$k = 0;
 
    for ($i=0; $i<strlen($txt); $i++) {
 
      $k = $k == strlen($mdKey) ? 0 : $k;
 
      $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
 
      $tmp .= $chars[$j];
 
    }
 
    return urlencode($ch.$tmp);
 
  }
 
  //解密函数
 
  function unlock_url($txt,$key='www.jb51.net')
 
  {
 
    $txt = urldecode($txt);
 
    $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
 
    $ch = $txt[0];
 
    $nh = strpos($chars,$ch);
 
    $mdKey = md5($key.$ch);
 
    $mdKey = substr($mdKey,$nh%8, $nh%8+7);
 
    $txt = substr($txt,1);
 
    $tmp = '';
 
    $i=0;$j=0; $k = 0;
 
    for ($i=0; $i<strlen($txt); $i++) {
 
      $k = $k == strlen($mdKey) ? 0 : $k;
 
      $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
 
      while ($j<0) $j+=64;
 
      $tmp .= $chars[$j];
 
    }
 
    return base64_decode($tmp);
 
  }

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读