微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个经典的PHP加密解密算法

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。
最常见的应用在用户登录以及一些API数据交换的场景。

最常见的应用在用户登录以及一些API数据交换的场景。
笔者收录了一些比较经典的PHP加密解密函数代码分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
1、非常给力的authcode加密函数discuz!经典代码(带详解):

 

 1 function authcode($string,$operation = 'DECODE',1)">$key = '',1)">$expiry = 0) {   
 2     // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙   
 3     $ckey_length = 4;   
 4        
 5      密匙   
 6     $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);   
 7        
 8      密匙a会参与加解密   
 9     $keya = md5(substr($key,16));   
10      密匙b会用来做数据完整性验证   
11     $keyb = 12      密匙c用于变化生成的密文   
13     $keyc = $ckey_length ? ($operation == 'DECODE' ? $ckey_length): 
14 substr(microtime()),-$ckey_length)) : ''15      参与运算的密匙   
16     $cryptkey = $keya.$keya.$keyc);   
17     $key_length = strlen($cryptkey18      明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b), 
19 //解密时会通过这个密匙验证数据完整性   
20     // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确   
21     $string = base64_decode($ckey_length)) :  
22 sprintf('%010d',1)">$expiry ? $expiry + time() : 0).$string.$keyb),16).$string23     $string_length = 24     $result = ''25     $Box = range(0,25526     $rndkey = array();   
27      产生密匙簿   
28     for($i = 0; $i <= 255; $i++29         $rndkey[$i] = ord($cryptkey[$i % $key_length30     }   
31      用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度   
32     $j = $i < 256; 33         $j = ($j + $Box[$i] + $i]) % 25634         $tmp = $i];   
35         $i] = $j36         $j] = $tmp37 38      核心加解密部分   
39     $a = $i < $string_length; 40         $a = ($a + 1) % 25641         $a]) % 25642         $a43         $a] = 44         45          从密匙簿得出密匙进行异或,再转成字符   
46         $result .= chr($string[$i]) ^ ($Box[($a] + $j]) % 256]));   
47 48     if($operation == 'DECODE') {  
49          验证数据有效性,请看未加密明文的格式   
50         if(($result,10) == 0 || time() > 0) &&  
51 )) {   
52             return 53         } else {   
54             return ''55         }   
56     } 57          把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因   
58         // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码   
59         return $keyc.str_replace('=','',base64_encode($result60 61 } 

 

函数authcode($string,$operation,$key,$expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。
用法

 

1 $str = 'abcdef'; 
2 $key = 'www.fyunw.com'3 $authcode =  authcode($str,'ENCODE',0); 加密 
4 echo $authcode;
5 echo authcode($authcode,'DECODE',1)">解密 

 

 

2、加解密函数encrypt():

 

function encrypt($operation,1)">$key=''){ 
 2     $key=$key); 
$key_length= 4       $string=$operation=='D'?base64_decode($string):$key),8). 5     $string_length=$rndkey=$Box=(); 
 7     $result=''$i=0;$i<=255; 9            $i]=$key[$i%]); 
10         $i]=11     } 
$j=$i<256;13         $j=($j+$i]+$i])%25614         $tmp=]; 
15         16         $j]=17 $a=$i<$string_length;19         $a=($a+1)%25620         $a])%25621         22         $a]=23         24         $result.=$i])^($a]+$j])%256])); 
25 26     $operation=='D'27         if()){ 
28             29         }{ 
30             return''31         } 
32     }33         )); 
34 35 } 

 

函数encrypt($string,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
用法

 

$str = 'abc'$token = encrypt(echo '加密:'.encrypt(echo '解密:'.encrypt($key); 

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐