zoukankan      html  css  js  c++  java
  • PHP实现AES加密解密

    1、mcrypt_encrypt AES加密,解密
     1 class Lib_desEnctyp
     2 {
     3     private $key = "";
     4     private $iv = "";
     5  
     6     /**
     7     * 构造,传递二个已经进行base64_encode的KEY与IV
     8     *
     9     * @param string $key
    10     * @param string $iv
    11     */
    12     function __construct ($key, $iv)
    13     {
    14         if (empty($key) || empty($iv)) {
    15             echo 'key and iv is not valid';
    16             exit();
    17         }
    18         $this->key = $key;
    19         $this->iv = $iv;
    20     }
    21  
    22     /**
    23     *加密
    24     * @param <type> $value
    25     * @return <type>
    26     */
    27     public function encrypt ($value)
    28     {
    29         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    30         $iv = base64_decode($this->iv);
    31         $value = $this->PaddingPKCS7($value);
    32         $key = base64_decode($this->key);
    33         mcrypt_generic_init($td, $key, $iv);
    34         $ret = base64_encode(mcrypt_generic($td, $value));
    35         mcrypt_generic_deinit($td);
    36         mcrypt_module_close($td);
    37         return $ret;
    38     }
    39  
    40     /**
    41     *解密
    42     * @param <type> $value
    43     * @return <type>
    44     */
    45     public function decrypt ($value)
    46     {
    47         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    48         $iv = base64_decode($this->iv);
    49         $key = base64_decode($this->key);
    50         mcrypt_generic_init($td, $key, $iv);
    51         $ret = trim(mdecrypt_generic($td, base64_decode($value)));
    52         $ret = $this->UnPaddingPKCS7($ret);
    53         mcrypt_generic_deinit($td);
    54         mcrypt_module_close($td);
    55         return $ret;
    56     }
    57  
    58     private function PaddingPKCS7 ($data)
    59     {
    60         $block_size = mcrypt_get_block_size('tripledes', 'cbc');
    61         $padding_char = $block_size - (strlen($data) % $block_size);
    62         $data .= str_repeat(chr($padding_char), $padding_char);
    63         return $data;
    64     }
    65  
    66     private function UnPaddingPKCS7($text)
    67     {
    68         $pad = ord($text{strlen($text) - 1});
    69         if ($pad > strlen($text)) {
    70             return false;
    71         }
    72         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
    73             return false;
    74         }
    75         return substr($text, 0, - 1 * $pad);
    76     }
    77 }
    2、openssl 加密,解密 [方式1]
     1 /**
     2  * DES加密类
     3  * User: gaowei
     4  * Date: 2017/12/12
     5  * Time: 19:23
     6  */
     7 class DesEncrypt {
     8     private $key = "";
     9     private $iv = "";
    10  
    11     /**
    12      * 构造,传递二个已经进行base64_encode的KEY与IV
    13      *
    14      * @param string $key
    15      * @param string $iv
    16      */
    17     function __construct ($key, $iv)
    18     {
    19         if (empty($key) || empty($iv)) {
    20             echo 'key and iv is not valid';
    21             exit();
    22         }
    23         $this->key = $key;
    24         $this->iv = $iv;//8
    25         //$this->iv = $iv.'00000000000';//16
    26  
    27     }
    28  
    29     /**
    30      * @title 加密
    31      * @author gaowei
    32      * @date 2017/12/18
    33      * @param string $value 要传的参数
    34      * @ //OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING //AES-128-ECB|AES-256-CBC|BF-CBC
    35      * @return json
    36      * */
    37     public function encrypt ($value) {
    38  
    39         //参考地址:https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl-encrypt-and-openssl-zero-padding-problems#
    40         $value = $this->PaddingPKCS7($value);
    41         $key = base64_decode($this->key);
    42         $iv  = base64_decode($this->iv);
    43         //AES-128-ECB|不能用 AES-256-CBC|16 AES-128-CBC|16 BF-CBC|8 aes-128-gcm|需要加$tag  DES-EDE3-CBC|8
    44         $cipher = "DES-EDE3-CBC";
    45         if (in_array($cipher, openssl_get_cipher_methods())) {
    46             //$ivlen = openssl_cipher_iv_length($cipher);
    47            // $iv = openssl_random_pseudo_bytes($ivlen);
    48             $result = openssl_encrypt($value, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
    49             //$result = base64_encode($result); //为3的时间要用
    50             //store $cipher, $iv, and $tag for decryption later
    51            /* $original_plaintext = openssl_decrypt($result, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);
    52             echo $original_plaintext."
    ";*/
    53         }
    54         return $result;
    55  
    56     }
    57     /**
    58      * @title 解密
    59      * @author gaowei
    60      * @date 2017/12/18
    61      * @param string $value 要传的参数
    62      * @return json
    63      * */
    64     public function decrypt ($value) {
    65         $key       = base64_decode($this->key);
    66         $iv        = base64_decode($this->iv);
    67         $decrypted = openssl_decrypt($value, 'DES-EDE3-CBC', $key, OPENSSL_SSLV23_PADDING, $iv);
    68         $ret = $this->UnPaddingPKCS7($decrypted);
    69         return $ret;
    70     }
    71  
    72     private function PaddingPKCS7 ($data) {
    73         //$block_size = mcrypt_get_block_size('tripledes', 'cbc');//获取长度
    74         //$block_size = openssl_cipher_iv_length('tripledes', 'cbc');//获取长度
    75         $block_size = 8;
    76         $padding_char = $block_size - (strlen($data) % $block_size);
    77         $data .= str_repeat(chr($padding_char), $padding_char);
    78         return $data;
    79     }
    80     private function UnPaddingPKCS7($text) {
    81         $pad = ord($text{strlen($text) - 1});
    82         if ($pad > strlen($text)) {
    83             return false;
    84         }
    85         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
    86             return false;
    87         }
    88         return substr($text, 0, - 1 * $pad);
    89     }
    90 }
    3、openssl 加密,解密 [方式2]
     1 /**
     2  * @desc:php aes加密解密类 
     3  * @author gl
     4  * @date 2019/08/31
     5  */
     6 class CI_Aes{
     7     /**
     8      * CI_Aes cipher
     9      * @var string
    10      */
    11     protected $cipher = 'aes-128-ecb';
    12     /**
    13      * CI_Aes key
    14      *
    15      * @var string
    16      */
    17     protected $key;
    18     /**
    19      * CI_Aes constructor
    20      * @param string $key Configuration parameter
    21      */
    22  
    23     public function __construct($key=null){
    24         $this->key = $key;
    25     }
    26  
    27     /**
    28      * Initialize
    29      *
    30      * @param array $params Configuration parameters
    31      * @return CI_Encryption
    32      */
    33     public function initialize($params)
    34     {
    35         if (!empty($params) && is_array($params)) {
    36             foreach ($params as $key => $val) {
    37                 $this->$key = $val;
    38             }
    39         }
    40     }
    41     /**
    42      * Encrypt
    43      *
    44      * @param string $data Input data
    45      * @return string
    46      */
    47     public function encrypt($data) {
    48         $endata =  openssl_encrypt($data, $this->cipher, $this->key, OPENSSL_RAW_DATA);
    49         return  bin2hex($endata);
    50     }
    51  
    52     /**
    53      * Decrypt
    54      *
    55      * @param string $data Encrypted data
    56      * @return string
    57      */
    58     public function decrypt($data) {
    59         $encrypted = hex2bin($data);
    60         return openssl_decrypt($encrypted, $this->cipher, $this->key, OPENSSL_RAW_DATA);
    61     }
    62  
    63 }
    4、其他 加密,解密
     1 //加密函数
     2 function lock_url($txt,$key='www.jb51.net')
     3 {
     4   $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
     5   $nh = rand(0,64);
     6   $ch = $chars[$nh];
     7   $mdKey = md5($key.$ch);
     8   $mdKey = substr($mdKey,$nh%8, $nh%8+7);
     9   $txt = base64_encode($txt);
    10   $tmp = '';
    11   $i=0;$j=0;$k = 0;
    12   for ($i=0; $i<strlen($txt); $i++) {
    13     $k = $k == strlen($mdKey) ? 0 : $k;
    14     $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
    15     $tmp .= $chars[$j];
    16   }
    17   return urlencode($ch.$tmp);
    18 }
    19 //解密函数
    20 function unlock_url($txt,$key='www.jb51.net')
    21 {
    22   $txt = urldecode($txt);
    23   $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
    24   $ch = $txt[0];
    25   $nh = strpos($chars,$ch);
    26   $mdKey = md5($key.$ch);
    27   $mdKey = substr($mdKey,$nh%8, $nh%8+7);
    28   $txt = substr($txt,1);
    29   $tmp = '';
    30   $i=0;$j=0; $k = 0;
    31   for ($i=0; $i<strlen($txt); $i++) {
    32     $k = $k == strlen($mdKey) ? 0 : $k;
    33     $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
    34     while ($j<0) $j+=64;
    35     $tmp .= $chars[$j];
    36   }
    37   return base64_decode($tmp);
    38 }
  • 相关阅读:
    hdu 2147博弈找规律
    hdu 1851 巴什博弈
    hdu 1729 sg博弈
    hdu 2516博弈找规律
    (转载)博弈之SG函数
    poj 2234基础Nim博弈||sg博弈
    hdu 1730 sg博弈||nim博弈
    hdu 1847 博弈找规律
    n hdu 1760 [SG博弈]二维状态
    hdu 1849 nim博弈
  • 原文地址:https://www.cnblogs.com/guliang/p/11763104.html
Copyright © 2011-2022 走看看