<?php
function hexchar2bin($str)
{
$arr = '';
$temp = null;
for ($i = 0; $i < strlen($str); $i = $i + 2) {
$arr .= "\\x" . substr($str, $i, 2);
}
eval('$temp="' . $arr . '";');
return $temp;
}
function getUid($uid)
{
$temp = null;
eval('$temp="' . $uid . '";');
return $temp;
}
function getEncryption($password, $uin, $vcode)
{
$uin = getUid($uin);
$str1 = hexchar2bin(strtoupper(md5($password)));
$str2 = strtoupper(md5($str1 . $uin));
return strtoupper(md5($str2 . strtoupper($vcode)));
}
//print_r(getEncryption('passwd','\x00\x00\x00\x00\xba\xaf\x34\x87','!GMO'));
function utf8_unicode($c)
{
switch (strlen($c)) {
case 1:
return ord($c);
case 2:
$n = (ord($c[0]) & 0x3f) << 6;
$n += ord($c[1]) & 0x3f;
return $n;
case 3:
$n = (ord($c[0]) & 0x1f) << 12;
$n += (ord($c[1]) & 0x3f) << 6;
$n += ord($c[2]) & 0x3f;
return $n;
case 4:
$n = (ord($c[0]) & 0x0f) << 18;
$n += (ord($c[1]) & 0x3f) << 12;
$n += (ord($c[2]) & 0x3f) << 6;
$n += ord($c[3]) & 0x3f;
return $n;
}
}
function getGTK($str)
{
$hash = 5381;
for ($i = 0, $len = strlen($str); $i < $len; ++$i) {
$hash += ($hash << 5) + utf8_unicode($str[$i]);
}
return $hash & 2147483647;
}
print_r(getGTK('@LNKTSNI0F'));
另一种g_tk的算法:
<?php
function charCodeAt($str, $index)
{
$char = mb_substr($str, $index, 1, 'UTF-8');
if (mb_check_encoding($char, 'UTF-8'))
{
$ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8');
return hexdec(bin2hex($ret));
}
else
{
return null;
}
}
function getGTK($str)
{
$md5key = 'tencentQQVIP123443safde&!%^%1282';
$salt = 5381;
$hash = $salt << 5;
for ($i = 0, $len = strlen($str); $i < $len; ++$i)
{
$asciicode = charCodeAt($str[$i], 0);
$hash = $hash . (($salt << 5) + $asciicode);
$salt = $asciicode;
}
return md5($hash . $md5key);
}
echo getGTK('AYg8iSVJL58F4X2EHBbIT5BS');