当前位置:首页 > PHP教程 > php函数 > 列表

四种好用的PHP自定义加密函数(可逆/不可逆)

发布:smiling 来源: PHP粉丝网  添加日期:2022-05-21 08:48:08 浏览: 评论:0 

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

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

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

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

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

二、第二种是加密函数是我在网上搜索来的,很好用,可逆加密,支持盐值参数
 
示例:
 
encrypt('abcd','1234')=》nkiV93IfJ decrypt('nkiV93IfJ','1234')=》abcd
 
  1. //加密函数 
  2.  
  3. function lockcode($code) { 
  4.  
  5.     static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'
  6.  
  7.     $num = $code
  8.  
  9.     $code = ''
  10.  
  11.     while ( $num > 0) { 
  12.  
  13.         $mod = $num % 35; 
  14.  
  15.         $num = ($num - $mod) / 35; 
  16.  
  17.         $code = $source_string[$mod].$code
  18.  
  19.     } 
  20.  
  21.     if(emptyempty($code[3])) 
  22.  
  23.         $code = str_pad($code,4,'0',STR_PAD_LEFT); 
  24.  
  25.     return $code
  26.  
  27.  
  28. //解密函数 
  29.  
  30. function unlockcode($code) { 
  31.  
  32.     static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ'
  33.  
  34.     if (strrpos($code'0') !== false) 
  35.  
  36.         $code = substr($codestrrpos($code'0')+1); 
  37.  
  38.     $len = strlen($code); 
  39.  
  40.     $code = strrev($code); 
  41.  
  42.     $num = 0; 
  43.  
  44.     for ($i=0; $i < $len$i++) { 
  45.  
  46.         $num += strpos($source_string$code[$i]) * pow(35, $i); 
  47.  
  48.     } 
  49.  
  50.     return $num
  51.  

//加密函数

  1. function encrypt($data,$key='CHENI'){   
  2.  
  3.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";   
  4.  
  5.     $nh = rand(0,64);   
  6.  
  7.     $ch = $chars[$nh];   
  8.  
  9.     $mdKey = md5($key.$ch);   
  10.  
  11.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);   
  12.  
  13.     $database64_encode($data);   
  14.  
  15.     $tmp = '';   
  16.  
  17.     $i=0;$j=0;$k = 0;   
  18.  
  19.     for ($i=0; $i<strlen($data); $i++) {   
  20.  
  21.         $k = $k == strlen($mdKey) ? 0 : $k;   
  22.  
  23.         $j = ($nh+strpos($chars,$data[$i])+ord($mdKey[$k++]))%64;   
  24.  
  25.         $tmp .= $chars[$j];   
  26.  
  27.     }   
  28.  
  29.     return urlencode($ch.$tmp);   
  30.  

//解密函数

  1. function decrypt($data,$key='CHENI'){ 
  2.  
  3.     $txt = urldecode($data);   
  4.  
  5.     $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";   
  6.  
  7.     $ch = $txt[0];   
  8.  
  9.     $nh = strpos($chars,$ch);   
  10.  
  11.     $mdKey = md5($key.$ch);   
  12.  
  13.     $mdKey = substr($mdKey,$nh%8, $nh%8+7);   
  14.  
  15.     $txt = substr($txt,1);   
  16.  
  17.     $tmp = '';   
  18.  
  19.     $i=0;$j=0; $k = 0;   
  20.  
  21.     for ($i=0; $i<strlen($txt); $i++) {   
  22.  
  23.         $k = $k == strlen($mdKey) ? 0 : $k;   
  24.  
  25.         $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);   
  26.  
  27.         while ($j<0) $j+=64;   
  28.  
  29.         $tmp .= $chars[$j];   
  30.  
  31.     }   
  32.  
  33.     return base64_decode($tmp);   
  34.  

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

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

  1. function encrypt($data$key)  {   
  2.  
  3.     $char=""
  4.  
  5.     $str=""
  6.  
  7.     $key    =   md5($key);   
  8.  
  9.     $x      =   0;   
  10.  
  11.     $len    =   strlen($data);   
  12.  
  13.     $l      =   strlen($key);   
  14.  
  15.     for ($i = 0; $i < $len$i++) {   
  16.  
  17.         if ($x == $l) { $x = 0; }   
  18.  
  19.         $char .= $key{$x};   
  20.  
  21.         $x++;   
  22.  
  23.     }   
  24.  
  25.     for ($i = 0; $i < $len$i++){   
  26.  
  27.         $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);   
  28.  
  29.     }   
  30.  
  31.     return base64_encode($str);   
  32.  
  33. }   
  34.  
  35. function decrypt($data$key) {   
  36.  
  37.     $key = md5($key);   
  38.  
  39.     $x = 0;   
  40.  
  41.     $data = base64_decode($data);   
  42.  
  43.     $len = strlen($data);   
  44.  
  45.     $l = strlen($key);   
  46.  
  47.     for ($i = 0; $i < $len$i++) {   
  48.  
  49.         if ($x == $l){ $x = 0;}   
  50.  
  51.         $char .= substr($key$x, 1);   
  52.  
  53.         $x++;   
  54.  
  55.     }   
  56.  
  57.     for ($i = 0; $i < $len$i++){   
  58.  
  59.         if (ord(substr($data$i, 1)) < ord(substr($char$i, 1))){   
  60.  
  61.             $str .= chr((ord(substr($data$i, 1)) + 256) - ord(substr($char$i, 1)));   
  62.  
  63.         }else{   
  64.  
  65.             $str .= chr(ord(substr($data$i, 1)) - ord(substr($char$i, 1)));   
  66.  
  67.         }   
  68.  
  69.     }   
  70.  
  71.     return $str;   
  72.  

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

  1. //加密算法 
  2.  
  3.     function authcode($string,$key='',$operation=false,$expiry=0){ 
  4.  
  5.         $ckey_length = 4; 
  6.  
  7.         $key = md5($key ? $key : DEFAULT_KEYS); 
  8.  
  9.         $keya = md5(substr($key, 0, 16)); 
  10.  
  11.         $keyb = md5(substr($key, 16, 16)); 
  12.  
  13.         $keyc = $ckey_length ? ($operationsubstr($string, 0, $ckey_length):substr(md5(microtime()), -$ckey_length)) : ''
  14.  
  15.         $cryptkey = $keya.md5($keya.$keyc); 
  16.  
  17.         $key_length = strlen($cryptkey); 
  18.  
  19.         $string = $operationbase64_decode(substr($string$ckey_length)) : 
  20.  
  21.         sprintf('%010d'$expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string
  22.  
  23.         $string_length = strlen($string); 
  24.  
  25.         $result = ''
  26.  
  27.         $box = range(0, 255); 
  28.  
  29.         $rndkey = array(); 
  30.  
  31.         for($i = 0; $i <= 255; $i++) { 
  32.  
  33.             $rndkey[$i] = ord($cryptkey[$i % $key_length]); 
  34.  
  35.         } 
  36.  
  37.         for($j = $i = 0; $i < 256; $i++) { 
  38.  
  39.             $j = ($j + $box[$i] + $rndkey[$i]) % 256; 
  40.  
  41.             $tmp = $box[$i]; 
  42.  
  43.             $box[$i] = $box[$j]; 
  44.  
  45.             $box[$j] = $tmp
  46.  
  47.         } 
  48.  
  49.         for($a = $j = $i = 0; $i < $string_length$i++) { 
  50.  
  51.             $a = ($a + 1) % 256; 
  52.  
  53.             $j = ($j + $box[$a]) % 256; 
  54.  
  55.             $tmp = $box[$a]; 
  56.  
  57.             $box[$a] = $box[$j]; 
  58.  
  59.             $box[$j] = $tmp
  60.  
  61.             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); 
  62.  
  63.         } 
  64.  
  65.         if($operation) { 
  66.  
  67.             if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && 
  68.  
  69.                 substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { 
  70.  
  71.                 return substr($result, 26); 
  72.  
  73.             } else { 
  74.  
  75.                 return ''
  76.  
  77.             } 
  78.  
  79.         } else { 
  80.  
  81.             return $keyc.str_replace('='''base64_encode($result)); 
  82.  
  83.         } 
  84.  
  85.     } 
  86.  
  87.     echo authcode('123456','key'); 
  88.  
  89.     echo '<br>'
  90.  
  91.     echo authcode('7d49kn9k07uSBZvha8as+/qm4UoLfpy88PFg12glPeDtlzc','key',true);

Tags: PHP自定义加密函数

分享到: