大佬教程收集整理的这篇文章主要介绍了【推荐】UCHome Authcode 详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
概述
define('UC_KEY',
'g3e2G1fbe3M973fet7n5j3t0Zcz8u2g9edj1g9J4B7h1aaB7ya6
489R_46_11845@0z0f4E5Mb'
); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致 代码 1 2 3 //定义默认函数初始值 4 //$
String="admin";初始化$sr
Ting变量数值在 5 //$keyc中调用 6@R_
607_
3816@ 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="abcdefghijklmnopqr
stuvwsyz "; //定义$key=abcdefghijklmnopqr
stuvwsyz 测试$keya结果
20 $keya = md5(substr($key, 0, 16)
);//用substr对$key进行截取得到从第一个到第16个字符
21 echo "$keya is $keya ";//输出$keya=abcdefghijklmnop
22 $key="abcdefghijklmnopqr
stuvwsyz123456";//定义$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 <= 25
5; $i++)
{ //ord()函数返回一个字符的askii码值;
45 //$rndke
Y[$i]根据$i /$key_length的余数然后用ord处理
46 //$cryptke
Y[$i % $key_length]返回$cryptkey 47 数组里的键值$i=2返回第二位
48 //$rndke
Y[$i]从数组的第$i位开始返回$rndke
Y[$i]的值
49 $rndke
Y[$i] = ord($cryptke
Y[$i % $key_length]
); //echo "$rndke
Y[$i] is $rndke
Y[2] ";
}
50 for($j = $i = 0; $i < 256; $i++)
{ 51 //$j是三个数相加与256取余
52 $j = ($j + $box[$i] + $rndke
Y[$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]) % 25
6])
); }//这么多吧!后边的我把函数给大家 就是算法的反复重用了, 67 //还调用了时间函数。//base64_encode()
returns 使用 base64 对 data 进行编码。 68 //设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层传输, 69 //例如电子邮件的主体。 //str_
replace() 函数使用一个字符串替换字符串中的另一些字符。 70 /*str_
replace(find,
replace,
String,count)find 规定要查找的值。 71 *
replace 规定替换 find 中的
值的值。 72 *0
String 规定被搜索的字符串。 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′,’ENCO
<div class="cnblogs_code">
@H_618_23@代码