Home > Backend Development > PHP Tutorial > 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)

青灯夜游
Release: 2023-04-09 09:58:01
forward
7752 people have browsed it

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);
    }
}
Copy after login

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);
    }
}
Copy after login

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);
    }

}
Copy after login

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);
}
Copy after login

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!

Related labels:
php
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template