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)的詳細內容,歡迎大家自行查閱資料學習交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM