PHP AES加解密(兼容php5,php7)
最近在工作中负责对接API,对方要求对业务数据进行AES 算法(256,ECB,补码方式:PKCS5Padding)加密。
加密算法要求如下:
算法AES/ECB/PKCS5Padding
密钥长度256
bin2hex(2 进制转 16 进制)
PKCS5Padding的示例代码:
private function pkcs5_pad($text, $padlen){ $span = $padlen-(strlen($text)%$padlen); return $text . str_repeat(chr($span),$span); } private function pkcs5_unpad($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); }
获取PHP版本:
public $versions =‘‘; #构造函数 public function __construct(){ $this->versions=substr(PHP_VERSION,0,3)*10; }
加密部分代码:
public function aes_encode($input) { if($this->versions<72){ // php<7.2 $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND); $size=mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); // PKCS5Padding补码 $input=$this->pkcs5_pad($input, $size); $encryptedStr = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$this->open_key, $input , MCRYPT_MODE_ECB,$iv); $data = strtoupper(bin2hex($encryptedStr)); }else{ // php>7.2 $ivlen = openssl_cipher_iv_length("AES-256-ECB"); $iv = openssl_random_pseudo_bytes($ivlen); $data = strtoupper(bin2hex(openssl_encrypt($input, "AES-256-ECB", $this->open_key, OPENSSL_RAW_DATA, $iv))); } return $data; }
由于要求加密后并转化为大写
解密部分代码:
public function aes_decode($aesStr) { $aesStr=hex2bin($aesStr); if($this->versions<72){ $decrypted=mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$this->open_key,$aesStr,MCRYPT_MODE_ECB); $data=$this->pkcs5_unpad($decrypted); }else{ $ivlen = openssl_cipher_iv_length("AES-256-ECB"); $iv = openssl_random_pseudo_bytes($ivlen); $data=openssl_decrypt($aesStr,‘AES-256-ECB‘,$this->open_key,OPENSSL_RAW_DATA,$iv); } return $data; }
最后补充下,PKCS5Padding其实就是字符串填充的算法,关于PKCS5Padding和初始化向量(iv)的详细内容,欢迎大家自行查阅资料学习交流。