最近在工作中負責對接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)的詳細內容,歡迎大家自行查閱資料學習交流。