hxp
2025-06-04 f4a514d5ac952110da846636ecbb9de951eaf3d2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
 
/**
 * QuickSDK游戏同步加解密算法描述
 * @copyright quicksdk 2015
 * @author quicksdk 
 * @version quicksdk v 0.0.1 2014/9/2
 */
class quickAsy
{
 
    /**
     * 解密方法
     * $strEncode 密文
     * $keys 解密密钥 为游戏接入时分配的 callback_key
     */
    public static function decode($strEncode, $keys)
    {
        if (empty($strEncode)) {
            return $strEncode;
        }
        preg_match_all('(\d+)', $strEncode, $list);
        $list = $list[0];
        if (count($list) > 0) {
            $keys = self::getBytes($keys);
            for ($i = 0; $i < count($list); $i++) {
                $keyVar = $keys[$i % count($keys)];
                $data[$i] = $list[$i] - (0xff & $keyVar);
            }
            return self::toStr($data);
        } else {
            return $strEncode;
        }
    }
 
    /**
     * 计算游戏同步签名
     */
    public static function getSign($params, $callbackkey)
    {
 
        return md5($params['nt_data'] . $params['sign'] . $callbackkey);
    }
    
    /**
     * 本地计算MD5签名PHP示例代码
     * @param $callbackkey 后台分配的通信密钥
     * @return 本地计算的md5签名值
     */
    public static function getMd5Sign($callbackkey)
    {
        $params = $_POST;
        unset($params['sign']);
        ksort($params);
        $signKey = '';
        foreach ($params as $key => $val) {
            $signKey .= $key . '=' . $val . '&';
        }
        $signKey .= $callbackkey;
        return md5($signKey);
    }
 
    public static function getMd5Sign2($callbackkey, $needLinkSign = true, $signKeyName = "sign")
    {
        $params = $_POST;
        unset($params[$signKeyName]);
        ksort($params);
        $signKey = '';
        foreach ($params as $key => $val) {
            if ($signKey != '') {
                $signKey .= "&";
            }
            $signKey .= $key . '=' . $val;
        }
        if ($needLinkSign) {
            $signKey .= '&';
        }
        $signKey .= $callbackkey;
        return md5($signKey);
    }
 
    /**
     * MD5签名替换
     */
    static private function replaceMD5($md5)
    {
 
        strtolower($md5);
        $bytes = self::getBytes($md5);
 
        $len = count($bytes);
 
        if ($len >= 23) {
            $change = $bytes[1];
            $bytes[1] = $bytes[13];
            $bytes[13] = $change;
 
            $change2 = $bytes[5];
            $bytes[5] = $bytes[17];
            $bytes[17] = $change2;
 
            $change3 = $bytes[7];
            $bytes[7] = $bytes[23];
            $bytes[23] = $change3;
        } else {
            return $md5;
        }
 
        return self::toStr($bytes);
    }
 
    /**
     * 转成字符数据
     */
    private static function getBytes($string)
    {
        $bytes = array();
        for ($i = 0; $i < strlen($string); $i++) {
            $bytes[] = ord($string[$i]);
        }
        return $bytes;
    }
 
    /**
     * 转化字符串
     */
    private static function toStr($bytes)
    {
        $str = '';
        foreach ($bytes as $ch) {
            $str .= chr($ch);
        }
        return $str;
    }
}