【推荐】UCHome Authcode 详解

 

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,接收的时候再解密。

你可能感兴趣的:(code)