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
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’);
echo $key;
echo ' ';
echo authcode($key,’DECODE’);
代码
e249cAlM1D7jOw2J6cSdxXmB/rZO4gvyJ6wlPth8r+b0qm2p+uoU blog123456
f517BhJrgZ00F7EUS6miU/tN7ioUzc7X84sPTonJzY9miV2ncX9r blog123456
7f57vCy8sM10zWPb1l4lWPFf4tNhbvWZymvbcB+k29aaSfRcO1AJ blog123456
5570HFun9MYDj6UyzUDjCUdhwWxbkX+B64oOSQLN+KbfmZuX1LAc blog123456
f517BhJrgZ00F7EUS6miU/tN7ioUzc7X84sPTonJzY9miV2ncX9r blog123456
7f57vCy8sM10zWPb1l4lWPFf4tNhbvWZymvbcB+k29aaSfRcO1AJ blog123456
5570HFun9MYDj6UyzUDjCUdhwWxbkX+B64oOSQLN+KbfmZuX1LAc blog123456
看下输出,$key的值每次都会变,但解密出来的结果确总是给定的字符串.这个可以在不同插件提交交数据的时候做一个密钥来用,url附加一个加密的key,接收的时候再解密。
来源:https://www.cnblogs.com/xiaochaohuashengmi/archive/2010/06/08/1754135.html