首页后端开发PHPPHP如何实现AES加密、解密?方法介绍(代码示例)

PHP如何实现AES加密、解密?方法介绍(代码示例)

时间2024-02-02 09:59:03发布访客分类PHP浏览440
导读:收集整理的这篇文章主要介绍了PHP如何实现AES加密、解密?方法介绍(代码示例),觉得挺不错的,现在分享给大家,也给大家做个参考。1、mcrypt_encrypt AES加密,解密class Lib_desEnctyp{ PRivat...
收集整理的这篇文章主要介绍了PHP如何实现AES加密、解密?方法介绍(代码示例),觉得挺不错的,现在分享给大家,也给大家做个参考。

1、mcrypt_encrypt AES加密,解密

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, '', MCRYPT_MODE_CBC, '');
            $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, '', MCRYPT_MODE_CBC, '');
            $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('tripledes', 'cbc');
            $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 加密,解密 [方式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 'key and iv is not valid';
                exit();
        }
            $this->
    key = $key;
            $this->
    iv = $iv;
    //8        //$this->
    iv = $iv.'00000000000';
//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, 'DES-EDE3-CBC', $key, OPENSSL_SSLV23_PADDING, $iv);
            $ret = $this->
    UnPaddingPKCS7($decrypted);
            return $ret;
    }
    private function PaddingPKCS7 ($data) {
            //$block_size = mcrypt_get_block_size('tripledes', 'cbc');
    //获取长度        //$block_size = openssl_cipher_iv_length('tripledes', 'cbc');
    //获取长度        $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 加密,解密 [方式2]

/** * @desc:php aes加密解密类 * @author gl * @date 2019/08/31 */class CI_Aes{
        /**     * CI_Aes cipher     * @VAR string     */    protected $cipher = 'aes-128-ecb';
        /**     * 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、其他 加密,解密

//加密函数function lock_url($txt,$key='www.jb51.net'){
      $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 = '';
      $i=0;
    $j=0;
    $k = 0;
      for ($i=0;
     $istrlen($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='www.jb51.net'){
      $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 = '';
      $i=0;
    $j=0;
     $k = 0;
      for ($i=0;
     $istrlen($txt);
 $i++) {
        $k = $k == strlen($mdKey) ? 0 : $k;
        $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
        while ($j0) $j+=64;
        $tmp .= $chars[$j];
  }
      return base64_decode($tmp);
}
    

相关教程推荐:《PHP教程》

以上就是PHP如何实现AES加密、解密?方法介绍(代码示例)的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: PHP如何实现AES加密、解密?方法介绍(代码示例)
本文地址: https://pptw.com/jishu/596691.html
了解PHP中的Trait 特性及作用 总结PHP字符串与数组处理函数用法

游客 回复需填写必要信息