概述
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; $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);
}
登录后复制
相关教程推荐:《PHP教程》
以上就是PHP如何实现AES加密、解密?方法介绍(代码示例)的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是自觉帆布鞋为你收集整理的PHP如何实现AES加密、解密?方法介绍(代码示例)的全部内容,希望文章能够帮你解决PHP如何实现AES加密、解密?方法介绍(代码示例)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复