更多课程 选择中心

PHP亚博足球官网
美国上市教育机构

400-111-8989

PHP亚博足球官网

PHP自定义加密函数

  • 发布:PHP亚博足球官网
  • 来源:PHP教程
  • 时间:2020-01-09 13:37

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这些加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。

最常见的应用在用户登录以及一些API数据交换的场景。最常见的应用在用户登录以及一些API数据交换的场景。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

废话不多说,直接上代码。

一、第一种针对于ID的可逆加密函数,也可以用作于邀请码之类的,解密后的数据比较简单

示例:lockcode(28)=》000X unlockcode('000X')=》28

//加密函数

function lockcode($code) {

   static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

   $num = $code;

   $code = '';

   while ( $num > 0) {

       $mod = $num % 35;

       $num = ($num - $mod) / 35;

       $code = $source_string[$mod].$code;

   }

   if(empty($code[3]))

       $code = str_pad($code,4,'0',STR_PAD_LEFT);

   return $code;

}

//解密函数

function unlockcode($code) {

   static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

   if (strrpos($code, '0') !== false)

       $code = substr($code, strrpos($code, '0')+1);

   $len = strlen($code);

   $code = strrev($code);

   $num = 0;

   for ($i=0; $i < $len; $i++) {

       $num += strpos($source_string, $code[$i]) * pow(35, $i);

   }

   return $num;

}

二、第二种是加密函数是我在网上搜索来的,很好用,可逆加密,支持盐值参数

示例:

encrypt('abcd','1234')=》nkiV93IfJ decrypt('nkiV93IfJ','1234')=》abcd

//加密函数 

function encrypt($data,$key='CHENI'){ 

   $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 

   $nh = rand(0,64); 

   $ch = $chars[$nh]; 

   $mdKey = md5($key.$ch); 

   $mdKey = substr($mdKey,$nh%8, $nh%8+7); 

   $data= base64_encode($data); 

   $tmp = ''; 

   $i=0;$j=0;$k = 0; 

   for ($i=0; $i<strlen($data); $i++) { 

       $k = $k == strlen($mdKey) ? 0 : $k; 

       $j = ($nh+strpos($chars,$data[$i])+ord($mdKey[$k++]))%64; 

       $tmp .= $chars[$j]; 

   } 

   return urlencode($ch.$tmp); 

}

//解密函数 

function decrypt($data,$key='CHENI'){

   $txt = urldecode($data); 

   $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); 

}

三、第三种跟上面的比较类似,也支持盐值参数

示例:encrypt('abcd','1234')=》mZPHxw== decrypt('mZPHxw==','1234')=》abcd

function encrypt($data, $key) { 

   $char="";

   $str="";

   $key   =  md5($key); 

   $x     =  0; 

   $len   =  strlen($data); 

   $l     =  strlen($key); 

   for ($i = 0; $i < $len; $i++) { 

       if ($x == $l) { $x = 0; } 

       $char .= $key{$x}; 

       $x++; 

   } 

   for ($i = 0; $i < $len; $i++){ 

       $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); 

   } 

   return base64_encode($str); 

function decrypt($data, $key) { 

   $key = md5($key); 

   $x = 0; 

   $data = base64_decode($data); 

   $len = strlen($data); 

   $l = strlen($key); 

   for ($i = 0; $i < $len; $i++) { 

       if ($x == $l){ $x = 0;} 

       $char .= substr($key, $x, 1); 

       $x++; 

   } 

   for ($i = 0; $i < $len; $i++){ 

       if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))){ 

           $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); 

       }else{ 

           $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); 

       } 

   } 

   return $str; 

}

四、这个是我用过最好用的一个了,discuz中使用的加密解密算法

//加密算法

   function authcode($string,$key='',$operation=false,$expiry=0){

       $ckey_length = 4;

       $key = md5($key ? $key : DEFAULT_KEYS);

       $keya = md5(substr($key, 0, 16));

       $keyb = md5(substr($key, 16, 16));

       $keyc = $ckey_length ? ($operation? substr($string, 0, $ckey_length):substr(md5(microtime()), -$ckey_length)) : '';

       $cryptkey = $keya.md5($keya.$keyc);

       $key_length = strlen($cryptkey);

       $string = $operation? base64_decode(substr($string, $ckey_length)) :

       sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;

       $string_length = strlen($string);

       $result = '';

       $box = range(0, 255);

       $rndkey = array();

       for($i = 0; $i <= 255; $i++) {

           $rndkey[$i] = ord($cryptkey[$i % $key_length]);

       }

       for($j = $i = 0; $i < 256; $i++) {

           $j = ($j + $box[$i] + $rndkey[$i]) % 256;

           $tmp = $box[$i];

           $box[$i] = $box[$j];

           $box[$j] = $tmp;

       }

       for($a = $j = $i = 0; $i < $string_length; $i++) {

           $a = ($a + 1) % 256;

           $j = ($j + $box[$a]) % 256;

           $tmp = $box[$a];

           $box[$a] = $box[$j];

           $box[$j] = $tmp;

           $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));

       }

       if($operation) {

           if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&

               substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {

               return substr($result, 26);

           } else {

               return '';

           }

       } else {

           return $keyc.str_replace('=', '', base64_encode($result));

       }

   }

   echo authcode('123456','key');

   echo '<br>';

   echo authcode('7d49kn9k07uSBZvha8as+/qm4UoLfpy88PFg12glPeDtlzc','key',true);

免责声明:文章转载自公开网络,如有侵权,请联系我们删除。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:php中传值与传引用的区别是什么
下一篇:没有下一篇了

php中传值与传引用的区别是什么

php实现利用expat方式解析xml文件

PHP上传图片到数据库并显示

PHP中sqlite3的使用

选择城市和中心
黑龙江省

吉林省

河北省

贵州省

云南省

广西省

海南省