1. php代码demo:

  1. <?php
    /**
    * PHP AES 加减密
    * @author xzh
    * @date 2018/3/22 下午10:08
    */
    class AesEncryptUtil
    {
    public static $blockSize = 32;
    //your cliend_id
    private $clientId;
    //your aesKey
    private $aesKey;
    /**
    * AesEncryptNewUtilUtil constructor.
    * @param $clientId
    * @param $encodingAesKey
    */
    public function __construct($clientId, $encodingAesKey)
    {
    $this->clientId = $clientId;
    $this->aesKey = base64_decode($encodingAesKey . "=");
    }
    /**
    * 对明文进行加密
    * @param $text
    * @return string
    * @throws Exception
    */
    public function encrypt($text)
    {
    try {
    // 获得16位随机字符串,填充到明文之前
    $random = $this->getRandomStr();;
    $text = $random . pack("N", strlen($text)) . $text . $this->clientId;
    $iv = substr($this->aesKey, 0, 16);
    // 对明文进行补位填充
    $text = $this->encode($text);
    // 加密
    $encrypted = openssl_encrypt($text, 'aes-256-cbc', $this->aesKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
    // 使用BASE64对加密后的字符串进行编码
    return base64_encode($encrypted);
    } catch (Exception $e) {
    throw new Exception("加密失败");
    }
    }
    /**
    * 对密文进行解密
    * @param $encrypted
    * @return bool|string
    * @throws Exception
    */
    public function decrypt($encrypted, $isCheckClientId = true)
    {
    try {
    // 使用BASE64对需要解密的字符串进行解码
    $ciphertextDec = base64_decode($encrypted);
    $iv = substr($this->aesKey, 0, 16);
    // 解密
    $decrypted = openssl_decrypt($ciphertextDec, 'aes-256-cbc', $this->aesKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
    } catch (Exception $e) {
    throw new Exception('AesEncryptUtil AES解密串非法,小于16位;');
    }
    try {
    // 去除补位字符
    $result = $this->decode($decrypted);
    // 去除16位随机字符串,网络字节序和clientId
    if (strlen($result) < 16) {
    throw new Exception('AesEncryptUtil AES解密串非法,小于16位;');
    }
    $content = substr($result, 16, strlen($result));
    $lenList = unpack("N", substr($content, 0, 4));
    $xmlLen = $lenList[1];
    $xmlContent = substr($content, 4, $xmlLen);
    $fromClientId = substr($content, $xmlLen + 4);
    } catch (Exception $e) {
    throw new Exception('AesEncryptUtil AES解密串非法,小于16位;');
    }
    if ($isCheckClientId && ($fromClientId != $this->clientId)) {
    throw new Exception('AesEncryptUtil AES解密串非法,小于16位;');
    }
    return $xmlContent;
    }
    /**
    * 对需要加密的明文进行填充补位
    * @param $text
    * @return string
    */
    private function encode($text)
    {
    $textLength = strlen($text);
    //计算需要填充的位数
    $amountToPad = self::$blockSize - ($textLength % self::$blockSize);
    if ($amountToPad == 0) {
    $amountToPad = self::$blockSize;
    }
    //获得补位所用的字符
    $padChr = chr($amountToPad);
    $tmp = "";
    for ($index = 0; $index < $amountToPad; $index++) {
    $tmp .= $padChr;
    }
    return $text . $tmp;
    }
    /**
    * 对解密后的明文进行补位删除
    * @param $text
    * @return bool|string
    */
    private function decode($text)
    {
    $pad = ord(substr($text, -1));
    if ($pad < 1 || $pad > self::$blockSize) {
    $pad = 0;
    }
    return substr($text, 0, (strlen($text) - $pad));
    }
    /**
    * 随机生成16位字符串
    * @return string
    */
    private function getRandomStr()
    {
    $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
    $max = strlen($strPol) - 1;
    $str = "";
    for ($i = 0; $i < 16; $i++) {
    $str .= $strPol[mt_rand(0, $max)];
    }
    return $str;
    }
    }
    $client_id = '12123';
    $aes_key = '1234567890123456789012345678901234567890123';
    $dataCoder = new AesEncryptUtil($client_id, $aes_key);
    $enData = $dataCoder->encrypt("testdata");
    $dataCoder->decrypt($enData);