PHP如何实现AES加密、解密?方法介绍(代码示例)
发布:smiling 来源: PHP粉丝网 添加日期:2022-07-13 11:49:03 浏览: 评论:0
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 (emptyempty($key) || emptyempty($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 (emptyempty($key) || emptyempty($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 (!emptyempty($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; $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='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; $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);
- }
Tags: AES加密 AES解密
- 上一篇:PHP 进程管理器 PHP-FPM
- 下一篇:最后一页

推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)