【推荐】UCHome Authcode 详解

血红的双手。 提交于 2020-03-10 23:22:45

 

define('UC_KEY', 'g3e2G1fbe3M973fet7n5j3t0Zcz8u2g9edj1g9J4B7h1aaB7ya6489M0z0f4E5Mb'); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致

  

代码
 1  
 2 
 3 //定义默认函数初始值  
 4 //$string="admin";初始化$srting变量数值在  
 5 //$keyc中调用  
 6 function authcode($string='admin', $operation = 'DECODE', $key = '', $expiry = 0) {         
 7 $ckey_length = 4;        // 随机密钥长度 取值 0-32;                                  
 8 // 加入随机密钥,可以令密文无任何规律,  
 9 //即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。                                  
10 // 取值越大,密文变动规律越大,密文变化 = //16 的 $ckey_length 次方                                  
11 // 当此值为 0 时,则不产生随机密钥                                 
12 $Mykey = md5(UC_KEY);  //对UC_KEY进行一次md5加密                                 
13 echo "$Mykey  -- $Mykey  "//输出  
14 //$Mykey==c647d451bb5792d9cc1693a672380641          
15 $key="";//定义key为empty                 
16 $key = md5($key ? $key : UC_KEY);  //使用三原操作符,如果$key为  
17 //空则对UC_KEY进行md5加密 否则对$key加密结果为$Mykey                
18   echo "$key  -- $key  ";//输出$key==c647d451bb5792d9cc1693a672380641                  
19 $key="abcdefghijklmnopqrstuvwsyz "//定义$key=abcdefghijklmnopqrstuvwsyz 测试$keya结果              
20     $keya = md5(substr($key, 0, 16));//用substr对$key进行截取得到从第一个到第16个字符                  
21 echo "$keya is $keya ";//输出$keya=abcdefghijklmnop        
22   $key="abcdefghijklmnopqrstuvwsyz123456";//定义$key         
23 $keyb =md5(substr($key, 16, 16));//通过substr对$key进行截取   
24 //截取方法为从第16位开始 向后截取到第32位结束         
25 echo "$keyb $keyb ";//       
26    //$keyc 使用的2层的三原操作符,理解如下$keyc = $ckey_length 的时候  
27 //返回($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length))   
28 //否则返回empty  
29 //上面的理解为$operation == 'DECODE';时候用substr截取$string变量的值,  
30 //截取大小为从第0个到第$ckey_length个默认$ckey_length为4$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';echo "$keyc is $keyc ";  
31 //输出按照我们初始的测试$keyc为admi$cryptkey = $keya.md5($keya.$keyc);//这个我估计不用说了   
32 //就是单纯的字符串拼接和md5之后再拼接  
33 echo "$cryptkey is $cryptkey";$key_length = strlen($cryptkey);//计算$cryptkey的长度本例为64  
34 echo "$key_length  is $key_length ";//base64_decode对encoded_data 进行解码,返回原始数据,  
35 //失败则返回 FALSE。返回的数据可能是二进制的         
36 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;        $string_length = strlen($string);       
37 echo "$satring is $string_length ";          
38 $result = '';//range() 返回数组中从 low 到 high 的单元,包括它们本身。  
39 如果 low > high,  
40 //则序列将从 high 到 low。//根据cuh的设置,说的白话一点就是生成一个0到255的纯数字数组      
41     $box = range(0, 255);         
42 echo "$box is $box[1] ";       
43    $rndkey = array();        //$i 输出0到255个整数        
44   for($i = 0$i <= 255$i++) {        //ord()函数返回一个字符的askii码值;         
45 //$rndkey[$i]根据$i /$key_length的余数然后用ord处理          
46 //$cryptkey[$i % $key_length]返回$cryptkey  
47 数组里的键值$i=2返回第二位        
48   //$rndkey[$i]从数组的第$i位开始返回$rndkey[$i]的值               
49    $rndkey[$i= ord($cryptkey[$i % $key_length]);                //echo "$rndkey[$i] is $rndkey[2]   ";        }       
50    for($j = $i = 0$i < 256$i++) {  
51 //$j是三个数相加与256取余                 
52 $j = ($j + $box[$i+ $rndkey[$i]) % 256;                 
53 $tmp = $box[$i];                
54   $box[$i= $box[$j];                  
55 $box[$j= $tmp;                //echo "$j is $j  ";        }//如果$i小于设定的随机密钥长度则$i加1        
56   for($a = $j = $i = 0$i < $string_length$i++) {                  
57 //在上面基础上再加1 然后和256取余  
58 $a = ($a + 1% 256;                  
59 $j = ($j + $box[$a]) % 256;//$j加$box[$a]的值 再和256取余                 
60 $tmp = $box[$a];                
61   $box[$a= $box[$j];               
62    $box[$j= $tmp;                // ^  位运算符允许对整型数中指定的位进行置位。  
63 //如果左右参数都是字符串,则位运算符将操作字符的 ASCII 值                 
64 //chr 返回相对应于 ascii 所指定的单个字符 。  
65 //也就是说根据chr函数里生成的数的ascii来指定要输出的字符                 
66 $result .= chr(ord($string[$i]) ^ ($box[($box[$a+ $box[$j]) % 256]));        }//这么多吧!后边的我把函数给大家 就是算法的反复重用了,  
67 //还调用了时间函数。//base64_encode() returns 使用 base64 对 data 进行编码。  
68 //设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输,  
69 //例如电子邮件的主体。 //str_replace() 函数使用一个字符串替换字符串中的另一些字符。  
70 /*str_replace(find,replace,string,count)find 规定要查找的值。   
71 *replace 规定替换 find 中的值的值。   
72 *0string 规定被搜索的字符串。  
73 *count 一个变量,对替换数进行计数。  
74 */         
75 if($operation == 'DECODE') {                 
76 if((substr($result, 0, 10== 0 || substr($result, 0, 10- time() > 0&& substr($result, 10, 16== substr(md5(substr($result, 26).$keyb), 0, 16)) {                         
77 return substr($result, 26);                  
78 else {                        return '';                }         
79 else {                return $keyc.str_replace('=', '', base64_encode($result));        }          
80 }
81 

 

 

 


$key=authcode(’blog123456′,’ENCODE’);
echo $key;
echo ' ';
echo authcode($key,’DECODE’);

 

 

代码
e249cAlM1D7jOw2J6cSdxXmB/rZO4gvyJ6wlPth8r+b0qm2p+uoU    blog123456
f517BhJrgZ00F7EUS6miU
/tN7ioUzc7X84sPTonJzY9miV2ncX9r    blog123456
7f57vCy8sM10zWPb1l4lWPFf4tNhbvWZymvbcB
+k29aaSfRcO1AJ    blog123456
5570HFun9MYDj6UyzUDjCUdhwWxbkX
+B64oOSQLN+KbfmZuX1LAc    blog123456

 

 


看下输出,$key的值每次都会变,但解密出来的结果确总是给定的字符串.这个可以在不同插件提交交数据的时候做一个密钥来用,url附加一个加密的key,接收的时候再解密。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!