Home  >  Article  >  Backend Development  >  How to implement AES encryption and decryption in PHP? Method introduction (code example)

How to implement AES encryption and decryption in PHP? Method introduction (code example)

青灯夜游
青灯夜游forward
2020-07-20 16:51:517671browse

How to implement AES encryption and decryption in PHP? Method introduction (code example)

1, mcrypt_encrypt AES encryption, decryption

class Lib_desEnctyp
{
    private $key = "";
    private $iv = "";

    /**
    * 构造,传递二个已经进行base64_encode的KEY与IV
    *
    * @param string $key
    * @param string $iv
    */
    function __construct ($key, $iv)
    {
        if (empty($key) || empty($iv)) {
            echo 'key and iv is not valid';
            exit();
        }
        $this->key = $key;
        $this->iv = $iv;
    }

    /**
    *加密
    * @param <type> $value
    * @return <type>
    */
    public function encrypt ($value)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);
        $iv = base64_decode($this->iv);
        $value = $this->PaddingPKCS7($value);
        $key = base64_decode($this->key);
        mcrypt_generic_init($td, $key, $iv);
        $ret = base64_encode(mcrypt_generic($td, $value));
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $ret;
    }

    /**
    *解密
    * @param <type> $value
    * @return <type>
    */
    public function decrypt ($value)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, &#39;&#39;, MCRYPT_MODE_CBC, &#39;&#39;);
        $iv = base64_decode($this->iv);
        $key = base64_decode($this->key);
        mcrypt_generic_init($td, $key, $iv);
        $ret = trim(mdecrypt_generic($td, base64_decode($value)));
        $ret = $this->UnPaddingPKCS7($ret);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $ret;
    }

    private function PaddingPKCS7 ($data)
    {
        $block_size = mcrypt_get_block_size(&#39;tripledes&#39;, &#39;cbc&#39;);
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }

    private function UnPaddingPKCS7($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);
    }
}

2, openssl encryption, decryption [Method 1]

/**
 * DES加密类
 * User: gaowei
 * Date: 2017/12/12
 * Time: 19:23
 */
class DesEncrypt {
    private $key = "";
    private $iv = "";

    /**
     * 构造,传递二个已经进行base64_encode的KEY与IV
     *
     * @param string $key
     * @param string $iv
     */
    function __construct ($key, $iv)
    {
        if (empty($key) || empty($iv)) {
            echo &#39;key and iv is not valid&#39;;
            exit();
        }
        $this->key = $key;
        $this->iv = $iv;//8
        //$this->iv = $iv.&#39;00000000000&#39;;//16

    }

    /**
     * @title 加密
     * @author gaowei
     * @date 2017/12/18
     * @param string $value 要传的参数
     * @ //OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING //AES-128-ECB|AES-256-CBC|BF-CBC
     * @return json
     * */
    public function encrypt ($value) {

        //参考地址:https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl-encrypt-and-openssl-zero-padding-problems#
        $value = $this->PaddingPKCS7($value);
        $key = base64_decode($this->key);
        $iv  = base64_decode($this->iv);
        //AES-128-ECB|不能用 AES-256-CBC|16 AES-128-CBC|16 BF-CBC|8 aes-128-gcm|需要加$tag  DES-EDE3-CBC|8
        $cipher = "DES-EDE3-CBC";
        if (in_array($cipher, openssl_get_cipher_methods())) {
            //$ivlen = openssl_cipher_iv_length($cipher);
           // $iv = openssl_random_pseudo_bytes($ivlen);
            $result = openssl_encrypt($value, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
            //$result = base64_encode($result); //为3的时间要用
            //store $cipher, $iv, and $tag for decryption later
           /* $original_plaintext = openssl_decrypt($result, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
            echo $original_plaintext."\n";*/
        }
        return $result;

    }
    /**
     * @title 解密
     * @author gaowei
     * @date 2017/12/18
     * @param string $value 要传的参数
     * @return json
     * */
    public function decrypt ($value) {
        $key       = base64_decode($this->key);
        $iv        = base64_decode($this->iv);
        $decrypted = openssl_decrypt($value, &#39;DES-EDE3-CBC&#39;, $key, OPENSSL_SSLV23_PADDING, $iv);
        $ret = $this->UnPaddingPKCS7($decrypted);
        return $ret;
    }

    private function PaddingPKCS7 ($data) {
        //$block_size = mcrypt_get_block_size(&#39;tripledes&#39;, &#39;cbc&#39;);//获取长度
        //$block_size = openssl_cipher_iv_length(&#39;tripledes&#39;, &#39;cbc&#39;);//获取长度
        $block_size = 8;
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }
    private function UnPaddingPKCS7($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);
    }
}

3. openssl encryption, decryption [Method 2]

/**
 * @desc:php aes加密解密类
 * @author gl
 * @date 2019/08/31
 */
class CI_Aes{
    /**
     * CI_Aes cipher
     * @var string
     */
    protected $cipher = &#39;aes-128-ecb&#39;;
    /**
     * CI_Aes key
     *
     * @var string
     */
    protected $key;
    /**
     * CI_Aes constructor
     * @param string $key Configuration parameter
     */

    public function __construct($key=null){
        $this->key = $key;
    }

    /**
     * Initialize
     *
     * @param array $params Configuration parameters
     * @return CI_Encryption
     */
    public function initialize($params)
    {
        if (!empty($params) && is_array($params)) {
            foreach ($params as $key => $val) {
                $this->$key = $val;
            }
        }
    }
    /**
     * Encrypt
     *
     * @param string $data Input data
     * @return string
     */
    public function encrypt($data) {
        $endata =  openssl_encrypt($data, $this->cipher, $this->key, OPENSSL_RAW_DATA);
        return  bin2hex($endata);
    }

    /**
     * Decrypt
     *
     * @param string $data Encrypted data
     * @return string
     */
    public function decrypt($data) {
        $encrypted = hex2bin($data);
        return openssl_decrypt($encrypted, $this->cipher, $this->key, OPENSSL_RAW_DATA);
    }

}

4. Other encryption and decryption

//加密函数
function lock_url($txt,$key=&#39;www.jb51.net&#39;)
{
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  $nh = rand(0,64);
  $ch = $chars[$nh];
  $mdKey = md5($key.$ch);
  $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  $txt = base64_encode($txt);
  $tmp = &#39;&#39;;
  $i=0;$j=0;$k = 0;
  for ($i=0; $i<strlen($txt); $i++) {
    $k = $k == strlen($mdKey) ? 0 : $k;
    $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
    $tmp .= $chars[$j];
  }
  return urlencode($ch.$tmp);
}
//解密函数
function unlock_url($txt,$key=&#39;www.jb51.net&#39;)
{
  $txt = urldecode($txt);
  $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  $ch = $txt[0];
  $nh = strpos($chars,$ch);
  $mdKey = md5($key.$ch);
  $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  $txt = substr($txt,1);
  $tmp = &#39;&#39;;
  $i=0;$j=0; $k = 0;
  for ($i=0; $i<strlen($txt); $i++) {
    $k = $k == strlen($mdKey) ? 0 : $k;
    $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
    while ($j<0) $j+=64;
    $tmp .= $chars[$j];
  }
  return base64_decode($tmp);
}

Related tutorial recommendations: "PHP Tutorial"

The above is the detailed content of How to implement AES encryption and decryption in PHP? Method introduction (code example). For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:cnblogs.com. If there is any infringement, please contact admin@php.cn delete