【PHP】实现AES、DES加密解密
1、mcrypt_encrypt DES加密,解密
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 DES加密,解密
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."\n";*/ 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 AES加密,解密
1 /** 2 * @desc:php aes加密解密类 3 * @author hh 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_str($txt,$key='haoayou') 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_str($txt,$key='haoayou') 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 }