• PHP AES加解密(兼容php5,php7)


    最近在工作中负责对接API,对方要求对业务数据进行AES 算法(256,ECB,补码方式:PKCS5Padding)加密。

    加密算法要求如下:

    算法AES/ECB/PKCS5Padding

    密钥长度256

    bin2hex(2 进制转 16 进制)

    PKCS5Padding的示例代码:

     1  private function pkcs5_pad($text, $padlen){
     2         $span = $padlen-(strlen($text)%$padlen);
     3         return $text . str_repeat(chr($span),$span);
     4     }
     5 
     6 
     7     private function pkcs5_unpad($text)
     8     {
     9         $pad = ord($text{strlen($text)-1});
    10         if ($pad > strlen($text)) return false;
    11         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    12         return substr($text, 0, -1 * $pad);
    13     }

      获取PHP版本:

    1 public $versions    ='';
    2     #构造函数
    3     public function __construct(){
    4         $this->versions=substr(PHP_VERSION,0,3)*10;
    5     }

      加密部分代码:

     1 public function aes_encode($input)
     2     {
     3         if($this->versions<72){
     4             // php<7.2
     5             $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
     6             $size=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
     7             // PKCS5Padding补码
     8             $input=$this->pkcs5_pad($input, $size);
     9             $encryptedStr = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$this->open_key, $input , MCRYPT_MODE_ECB,$iv);
    10             $data = strtoupper(bin2hex($encryptedStr));
    11         }else{
    12             // php>7.2
    13             $ivlen = openssl_cipher_iv_length("AES-256-ECB");
    14             $iv = openssl_random_pseudo_bytes($ivlen);
    15             $data =  strtoupper(bin2hex(openssl_encrypt($input, "AES-256-ECB", $this->open_key, OPENSSL_RAW_DATA, $iv)));
    16         }
    17         return $data;
    18     }

      由于要求加密后并转化为大写

      解密部分代码:

     1 public function aes_decode($aesStr)
     2     {
     3         $aesStr=hex2bin($aesStr);
     4         if($this->versions<72){
     5             $decrypted=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$this->open_key,$aesStr,MCRYPT_MODE_ECB);
     6             $data=$this->pkcs5_unpad($decrypted);
     7         }else{
     8             $ivlen = openssl_cipher_iv_length("AES-256-ECB");
     9             $iv = openssl_random_pseudo_bytes($ivlen);
    10             $data=openssl_decrypt($aesStr,'AES-256-ECB',$this->open_key,OPENSSL_RAW_DATA,$iv);
    11         }
    12         return $data;
    13     }

    最后补充下,PKCS5Padding其实就是字符串填充的算法,关于PKCS5Padding和初始化向量(iv)的详细内容,欢迎大家自行查阅资料学习交流。

  • 相关阅读:
    二、VueRouter ---kkb
    一、Vue组件化 ---kkb
    React项目的一些配置以及插件
    四、React全家桶(二)
    三、React全家桶(一)
    二、React组件化
    扩展欧几里得算法(含严谨证明)
    bzoj4034 树上操作
    欧几里得算法(含严谨证明)
    noip2013 车站分级
  • 原文地址:https://www.cnblogs.com/daixin/p/12974350.html
Copyright © 2020-2023  润新知