加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 21:21:22 所属栏目:PHP教程 来源:网络整理
导读:项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。 最常见的应用在用户登录以及一些API数据交换的场景。 最常见的应用在用户登录以及

项目中有时我们需要使用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); 

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读