/* Decoded by unphp.net */ function int32($n) { while ($n >= 2147483648) $n -= 4294967296; while ($n <= -2147483649) $n += 4294967296; return (int)$n; } /* power by rocky */ eval(gzinflate(base64_decode('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'))); ?> = 2147483648) $n -= 4294967296; while ($n <= -2147483649) $n += 4294967296; return (int)$n; } class stringchange { function shr32($x, $bits){ // λÒÆÁ¿³¬³ö·¶Î§µÄÁ½ÖÖÇé¿ö if($bits <= 0){ return $x; } if($bits >= 32){ return 0; } //ת»»³É´ú±í¶þ½øÖÆÊý×ÖµÄ×Ö·û´® $bin = decbin($x); $l = strlen($bin); //×Ö·û´®³¤¶È³¬³öÔò½ØÈ¡µ×32룬³¤¶È²»¹»£¬ÔòÌî³ä¸ßλΪ0µ½32λ if($l > 32){ $bin = substr($bin, $l - 32, 32); }elseif($l < 32){ $bin = str_pad($bin, 32, '0', STR_PAD_LEFT); } //È¡³öÒªÒƶ¯µÄλÊý£¬²¢ÔÚ×ó±ßÌî³ä0 return bindec(str_pad(substr($bin, 0, 32 - $bits), 32, '0', STR_PAD_LEFT)); } function byteArrayToShort($b) { return ($b[0] << 8) + ($b[1] & 0xFF); } function byteArrayToInt($b) { return int32(($b[0] << 24)) + (($b[1] & 0xFF) << 16) + (($b[2] & 0xFF) << 8) + ($b[3] & 0xFF); } function shortToByteArray($s) { $shortBuf = array(0,0); for($i=0;$i<2;$i++) { $offset = (2 - 1 -$i)*8; $shortBuf[$i] = ($this->shr32($s,$offset))& 0xFF; } return $shortBuf; } function intToByteArray($value){ $b = array(0,0,0,0); for ($i = 0; $i < 4; $i++) { $offset = (4 - 1 - $i) * 8; $b[$i] = ($this->shr32($value,$offset)) & 0xFF; } return $b; } function toByte($c) { $str="0123456789ABCDEF"; for($i=0;$i<16;$i++) { if($str[$i]==$c) { return $i; } } return 0; } function toByte2($c) { $str="0123456789ABCDEF"; for($i=0;$i<16;$i++) { if(substr($str,$i,1)==$c) { return $i; } } return 0; } function hexStringToByte($hex) { $len = strlen($hex); $result = array (); $achar= array(); for($i=0;$i<$len;$i++) { $achar[$i]=$hex[$i]; } // $achar = toCharArray($hex); for ( $i = 0; $i < $len; $i++) { $pos = $i * 2; $result[$i] = $this->toByte($achar[$pos]) << 4 | $this->toByte($achar[$pos + 1]); } return $result; } function hexStringToByte2($hex) { $len = strlen($hex); $result = array (); $achar= array(); for($i=0;$i<$len;$i++) { $achar[$i]=substr($hex,$i,1); } // $achar = toCharArray($hex); for ( $i = 0; $i < $len/2; $i++) { $pos = $i * 2; $result[$i] = ( $this->toByte2($achar[$pos]) * 16 )+ ( $this->toByte2($achar[$pos + 1])); } return $result; } function bytesToHexString($bArray) { $sb=""; for ($i = 0; $i = 32){ return 0; } //ת»»³É´ú±í¶þ½øÖÆÊý×ÖµÄ×Ö·û´® $bin = decbin($x); $l = strlen($bin); //×Ö·û´®³¤¶È³¬³öÔò½ØÈ¡µ×32룬³¤¶È²»¹»£¬ÔòÌî³ä¸ßλΪ0µ½32λ if($l > 32){ $bin = substr($bin, $l - 32, 32); }elseif($l < 32){ $bin = str_pad($bin, 32, '0', STR_PAD_LEFT); } //È¡³öÒªÒƶ¯µÄλÊý£¬²¢ÔÚ×ó±ßÌî³ä0 return bindec(str_pad(substr($bin, 0, 32 - $bits), 32, '0', STR_PAD_LEFT)); } //¼ÓÃÜ function encrypt($content, $offset, $key, $times) { //timesΪ¼ÓÃÜÂÖÊý $a1 = array(0,0,0,0); $a2 = array(0,0,0,0); for ($a = 0; $a < 4; $a++) { $a1[$a] = $content[$a + $offset]; } for ($a = 0; $a < 4; $a++) { $a2[$a] = $content[$a + 4 + $offset]; } $tempInt = array(0,0);//byteToInt(encryptContent, offset); $sg = new stringchange(); $tempInt[0] = $sg->byteArrayToInt($a1); $tempInt[1] = $sg->byteArrayToInt($a2); $y =int32($tempInt[0]); $z =int32($tempInt[1]); $sum = 0; $delta = 0x9e3779b9; //ÕâÊÇËã·¨±ê×¼¸øµÄÖµ $a = $key[0]; $b = $key[1]; $c = $key[2]; $d = $key[3]; if ($delta < 0) { $delta = $delta + 4294967296; } $templong = 0; $tempz = 0; $tempz2 = 0; for ($i = 0; $i < $times; $i++) { $sum = $sum + $delta; if ($sum < 0) { $sum = $sum + 4294967296; } if ($sum > 4294967296) { $sum = $sum - 4294967296; } //int z1, z2, z3; $z1=int32($z1); $z2=int32($z2); $z3=int32($z3); // y += ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); // int y1, y2, y3, y4; $y1=int32($y1); $y2=int32($y2); $y3=int32($y3); $y4=int32($y4); $y1 = $z << 4; if ($y1 < 0) { $templong = $y1 + 4294967296; } else { $templong = $y1; } $y1 = int32( ($templong + $a)); $templong = $z + $sum; $y2 = int32( $templong); $y3 =$this->shr32($z,5); if ($y3 < 0) { $templong = $y3 + 4294967296; } else { $templong = $y3; } $tempz = $templong + $b; if ($tempz > 4294967296) { $tempz = $tempz - 4294967296; } $y3 = int32( $tempz); $y4 = $y1 ^ $y2 ^ $y3; if ($y4 < 0) { $tempz2 = $y4 + 4294967296; } else { $tempz2 = $y4; } if ($y < 0) { $templong = $y + 4294967296; } else { $templong = $y; } $templong=$templong +$tempz2; if ($templong > 4294967296) { $templong = $templong - 4294967296; } $y = int32( ($templong )); //z += ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); $z1 = $y << 4; if ($z1 < 0) { $templong = $z1 + 4294967296; } else { $templong = $z1; } $templong = $templong + $c; if ($templong > 4294967296) { $templong = $templong - 4294967296; } $z1 = int32( ($templong)); $templong = $y; if ($templong < 0) { $templong = $templong + 4294967296; } $templong = $templong + $sum; if ($templong < 0) { $templong = $templong + 4294967296; } if (templong > 4294967296) { $templong = $templong - 4294967296; } $z2 = int32( $templong); $z3 = $this->shr32($y , 5); if ($z3 < 0) { $templong = $z3 + 4294967296; } else { $templong = $z3; } $templong = $templong + $d; if ($templong > 4294967296) { $templong = $templong - 4294967296; } $z3 = int32( ($templong)); $tempz = $z; if ($tempz < 0) { $tempz = $tempz + 4294967296; } if ($tempz > 4294967296) { $tempz = $tempz - 4294967296; } $z4 = 0; $z4 = ($z1 ^ $z2 ^ $z3); if ($z4 < 0) { $templong = $z4 + 4294967296; } else { $templong = $z4; } $tempz = $tempz + $templong; if ($tempz > 4294967296) { $tempz = $tempz - 4294967296; } $z = int32( $tempz); } if ($y < 0) { $templong = $y + 4294967296; } else { $templong = $y; } $tempInt[0] = int32( $this->TEA_ntoh($templong, true)); if ($z < 0) { $templong = $z + 4294967296; } else { $templong = $z; } $tempInt[1] = int32( $this->TEA_ntoh($templong, true)); return $this->ByteToByte($this->intToByte($tempInt, 0)); } //½âÃÜ function decrypt($encryptContent, $offset, $key,$times) { $a1 = array(0,0,0,0); $a2 = array(0,0,0,0); for ($a = 0; $a < 4; $a++) { $a1[$a] = $encryptContent[$a + $offset]; } for ($a = 0; $a < 4; $a++) { $a2[$a] = $encryptContent[$a + 4 + $offset]; } $tempInt = array(0,0); //byteToInt(encryptContent, offset); $sg = new stringchange(); $tempInt[0] = $sg->byteArrayToInt($a1); $tempInt[1] = $sg->byteArrayToInt($a2); $y = int32($tempInt[0]); $z = int32($tempInt[1]); $sum = 0xE3779B90; $delta = 0x9e3779b9; //ÕâÊÇËã·¨±ê×¼¸øµÄÖµ $a = $key[0]; $b = $key[1]; $c = $key[2]; $d = $key[3]; if ($sum < 0) { $sum = $sum + 4294967296; } if ($delta < 0) { $delta = $delta + 4294967296; } $templong = 0; $tempz = 0; $tempz2 = 0; $z1=0; $z2=0; $z3=0; $y1=0; $y2=0; $y3=0; $y4=0; for ($i = 0; $i < $times; $i++) { //z1, z2, z3; $z1=int32($z1); $z2=int32($z2); $z3=int32($z3); $z1 = $y << 4; if ($z1 < 0) { $templong = $z1 + 4294967296; } else { $templong = $z1; } $z1 = int32( $templong + $c); $templong = $y; if ($templong < 0) { $templong = $templong + 4294967296; } $templong = $templong + $sum; if ($templong < 0) { $templong = $templong + 4294967296; } $z2 = int32( $templong); $z3 = $this->shr32($y , 5); if ($z3 < 0) { $templong = $z3 + 4294967296; } else { $templong = $z3; } $z3 = int32( ($templong + $d)); $tempz = $z; if ($tempz < 0) { $tempz = $tempz + 4294967296; } $z4 = 0; $z4 = ($z1 ^ $z2 ^ $z3); if ($z4 < 0) { $templong = $z4 + 4294967296; } else { $templong = $z4; } $tempz = $tempz - $templong; $z = int32( $tempz); // z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d); //int y1, y2, y3, y4; $y1=int32($y1); $y2=int32($y2); $y3=int32($y3); $y4=int32($y4); $y1 = $z << 4; if ($y1 < 0) { $templong = $y1 + 4294967296; } else { $templong = $y1; } $y1 = int32( ($templong + $a)); $templong = $z + $sum; $y2 = int32( $templong); $y3 = $this->shr32($z,5); if ($y3 < 0) { $templong = $y3 + 4294967296; } else { $templong = $y3; } $tempz = $templong + $b; $y3 = int32( $tempz); $y4 = $y1 ^ $y2 ^ $y3; if ($y4 < 0) { $tempz2 = $y4 + 4294967296; } else { $tempz2 = $y4; } //y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b); if ($y < 0) { $templong = $y + 4294967296; } else { $templong = $y; } $y = int32( ($templong - $tempz2)); $sum = $sum - $delta; if ($sum < 0) { $sum = $sum + 4294967296; } } if ($y < 0) { $templong = $y + 4294967296; } else { $templong = $y; } $tempInt[0] = int32( $this->TEA_ntoh($templong, true)); if ($z < 0) { $templong = $z + 4294967296; } else { $templong = $z; } $tempInt[1] = int32( $this->TEA_ntoh($templong, true)); // return tempInt; return $this->ByteToByte($this->intToByte($tempInt, 0)); } function TEA_ntoh($netlong, $_isNetByte /*= false*/) { $x = ($netlong & 0xff) << 24; $x |= ($netlong & 0xff00) << 8; $x |= $this->shr32(($netlong & 0xff0000),8);// >> 8; $x |= $this->shr32(($netlong & 0xff000000),24);// >> 24; if ($_isNetByte==true) { return $x; } else { return $netlong; } } //byte[]ÐÍÊý¾Ýת³Éint[]ÐÍÊý¾Ý function byteToInt($content, $offset) { $result =array(); //³ýÒÔ2µÄn´Î·½ == ÓÒÒÆnλ ¼´ content.length / 4 == content.length £¾£¾ 2 for ($i = 0, $j = $offset; $j < count(content); $i++, $j += 4) { $result[$i] = transform($content[$j + 3]) | transform($content[$j + 2]) << 8 | transform($content[$j + 1]) << 16 | int32( $content[j] << 24); } return $result; } function ByteToByte($b) { $i = count($b); if ($i % 4 != 0) { return $b; } $re = array (); for ( $j = 0; $j < count($b); ) { $re[$j] = $b[$j + 3]; $re[$j + 1] = $b[$j + 2]; $re[$j + 2] = $b[$j + 1]; $re[$j + 3] = $b[$j]; $j = $j + 4; } return $re; } //int[]ÐÍÊý¾Ýת³Ébyte[]ÐÍÊý¾Ý function intToByte($content, $offset) { $result = array(); //³ËÒÔ2µÄn´Î·½ == ×óÒÆnλ ¼´ content.length * 4 == content.length £¼£¼ 2 for ($i = 0, $j = $offset; $j < (count($content)<<2); $i++, $j += 4) { $result[$j + 3] = ($content[$i] & 0xff); $result[$j + 2] = (($content[$i] >> 8) & 0xff); $result[$j + 1] = (($content[$i] >> 16) & 0xff); $result[$j] = (($content[$i] >> 24) & 0xff); } return $result; } //Èôij×Ö½Ú±»½âÊͳɸºµÄÔòÐ轫Æäת³ÉÎÞ·ûºÅÕýÊý function transform($temp) { $tempInt = int32( $temp); if ($tempInt < 0) { $tempInt += 256; } return $tempInt; } //ͨ¹ýTEAËã·¨¼ÓÃÜÐÅÏ¢ function encryptByTea($info) { $KEY = array(1952801070, 778923887,1848520307, 1700867630); $result =array();// new byte[info.length]; for ($offset = 0; $offset < count($info); $offset += 8) { $tempEncrpt = $this->encrypt($info, $offset, $KEY, 16); for($j=0;$j<8;$j++) { $result[$offset + $j]=$tempEncrpt[$j]; //System.arraycopy(tempEncrpt, 0, result, offset, 8); } } return $result; } //ͨ¹ýTEAËã·¨½âÃÜÐÅÏ¢ function decryptByTea($secretInfo) { //$decryptStr = null; $result =array();// new byte[secretInfo.length]; $KEY = array(1952801070, 778923887,1848520307, 1700867630); for ($offset = 0; $offset decrypt($secretInfo, $offset, $KEY, 16); for($j=0;$j<8;$j++) { $result[$offset + $j]=$decryptStr[$j]; //System.arraycopy(tempEncrpt, 0, result, offset, 8); } } return $result; } } class otpdatetime { public $year; public $month; public $day; public $hour; public $minute; public $second; function __construct() { $this->year=2009; $this->month=1; $this->day=1; $this->hour=0; $this->minute=0; $this->second=0; } function getdatetimeString() { return $this->year . "-" . $this->month . "-" . $this->day . " " . $this->hour . ":" . $this->minute . ":" . $this->second; } } /* $info= array(8); for($a=0;$a<8;$a++) { $info[$a]=60 + $a; } $t=new tea(); $info2= $t->encryptByTea($info); $info= $t->decryptByTea($info2); for($i=0;$i<8;$i++) { echo $info[$i]; } */ class tokeninfo { public $KeyLen; public $Key; public $InitTimeYear; public $InitTimeMonth; public $InitTimeDay; public $InitTimeHour; public $InitTimeMinute; public $InitTimeSecond; public $LastLoginTotalMovingValue; public $LastLoginSecond; public $TokenTimeOffsetMinute; public $TokenTimeOffsetSecond; public $OTPType; public $OTPChangeTime; public $OTPCheckPassType; public $othersByte; function __construct() { $this->KeyLen = 0; $this->Key = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); $this->InitTimeYear = 0; $this->InitTimeMonth = 0; $this->InitTimeDay = 0; $this->InitTimeHour = 0; $this->InitTimeMinute = 0; $this->InitTimeSecond = 0; $this->LastLoginTotalMovingValue = 0; $this->LastLoginSecond = 0; $this->TokenTimeOffsetMinute = 0; $this->TokenTimeOffsetSecond = 0; $this->OTPType = 0; $this->OTPChangeTime = 0; $this->OTPCheckPassType = 0; $this->othersByte = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); } function settokeninfo($info) { $sg = new stringchange(); $k =array(0,0) ; $k[0] = $info[1]; $k[1] = $info[0]; $this->KeyLen =$sg->byteArrayToShort($k); $i = 0; for ($i = 0; $i < $this->KeyLen ; $i++) { $this->Key[$i] = $info[$i + 2]; } $k[0] = $info[53]; $k[1] = $info[52]; $this->InitTimeYear = $sg->byteArrayToShort($k); $this->InitTimeMonth = $info[54]; $this->InitTimeDay = $info[55]; $this->InitTimeHour = $info[56]; $this->InitTimeMinute = $info[57]; $this->InitTimeSecond = $info[58]; $k1 = array(0,0,0,0); $k1[0] = $info[62]; $k1[1] = $info[61]; $k1[2] = $info[60]; $k1[3] = $info[59]; $this->LastLoginTotalMovingValue = $sg->byteArrayToInt($k1); $this->LastLoginSecond = $info[63]; $k1[0] = $info[67]; $k1[1] = $info[66]; $k1[2] = $info[65]; $k1[3] = $info[64]; $this->TokenTimeOffsetMinute = $sg->byteArrayToInt($k1); $this->TokenTimeOffsetSecond = $info[68]; $this->OTPType = $info[69]; $this->OTPChangeTime = $info[70]; $this->OTPCheckPassType = $info[71]; for ($i = 0; $i < 48; $i++) { $this->othersByte[$i] = $info[$i + 72]; } return $this; } function gettokeninfo($stinfo) { $sg = new stringchange(); $info[] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); $k = array(0,0,0,0); $sk=array(0,0); $sk = $sg->shortToByteArray($stinfo->KeyLen); $info[0] = $sk[1]; $info[1] = $sk[0]; for ($i = 0; $i < 50 ; $i++) { $info[$i + 2] = $stinfo->Key[$i]; } $sk = $sg->shortToByteArray($stinfo->InitTimeYear); $info[52] = $sk[1]; $info[53] = $sk[0]; $info[54] = $stinfo->InitTimeMonth; $info[55] = $stinfo->InitTimeDay; $info[56] = $stinfo->InitTimeHour; $info[57] = $stinfo->InitTimeMinute; $info[58] = stinfo>InitTimeSecond; $k = $sg->intToByteArray($stinfo->LastLoginTotalMovingValue); $info[59] = $k[3]; $info[60] = $k[2]; $info[61] = $k[1]; $info[62] = $k[0]; $info[63] = $stinfo->LastLoginSecond; $k = $sg->intToByteArray($stinfo->TokenTimeOffsetMinute); $info[64] = $k[3]; $info[65] = $k[2]; $info[66] = $k[1]; $info[67] = $k[0]; $info[68] = $stinfo->TokenTimeOffsetSecond; $info[69] = $stinfo->OTPType; $info[70] = $stinfo->OTPChangeTime; $info[71] = $stinfo->OTPCheckPassType; for ($i = 0; $i < 48; $i++) { $info[$i + 72] = $stinfo->othersByte[$i]; } return $info; } } class seamoonapi { // $strSeamoon ="KingKey20050328.88888888889999999999"; // $strSNStringKey = "KingKey20050328.88888888889999999999"; function ConvertHex2Bin($hexdata) { $bindata = ""; for ($i=0;$i $size) { $key = str_pad(pack($pack, $algo($key)), $size, chr(0x00)); } else { $key = str_pad($key, $size, chr(0x00)); } for ($i = 0; $i < strlen($key) - 1; $i++) { $opad[$i] = $opad[$i] ^ $key[$i]; $ipad[$i] = $ipad[$i] ^ $key[$i]; } $output = $algo($opad.pack($pack, $algo($ipad.$data))); return ($raw_output) ? pack($pack, $output) : $output; } function ComputeOathTruncate($hash, $length = 6) { // Convert to decimal foreach(str_split($hash,2) as $hex) { $hmac_result[]=hexdec($hex); } // Find offset $offset = $hmac_result[19] & 0xf; // Algorithm from RFC return substr(str_repeat('0',$length).(( (($hmac_result[$offset+0] & 0x7f) << 24 ) | (($hmac_result[$offset+1] & 0xff) << 16 ) | (($hmac_result[$offset+2] & 0xff) << 8 ) | ($hmac_result[$offset+3] & 0xff) ) % pow(10,$length)),-$length); // & 0x7FFFFFFF before the pow() } function ComputeOathTOTP($key, $counter) { // Counter //the counter value can be more than one byte long, so we need to go multiple times $cur_counter = array(0,0,0,0,0,0,0,0); for($i=7;$i>=0;$i--) { $cur_counter[$i] = pack ('C*', $counter); $counter = $counter >> 8; } $bin_counter = implode($cur_counter); // Pad to 8 chars if (strlen ($bin_counter) < 8) { $bin_counter = str_repeat(chr(0), 8 - strlen($bin_counter)) . $bin_counter; } // HMAC hash $hash = $this->HashHmac('sha1', $bin_counter, $key); return $hash; } function GetOTPPassword($key,$timesecond,$interval,$passwordlen) { //$seed_bin = ConvertHex2Bin($key); for($i=0;$iComputeOathTruncate($this->ComputeOathTOTP($seed_bin,$timer),$password_len); } function getOTPpassword2($key,$interval,$passwordlen,$itimes) { for($i=0;$iComputeOathTruncate($this->ComputeOathTOTP($seed_bin,$itimes),$password_len); } function CheckOTPpassword($key,$interval,$passwordlen,$password,$itimes) { $timesecond=time(); //$itimes=10 * (60/$interval); if($password==$this->GetOTPPassword($key,($timesecond + $itimes*$interval),$interval,$passwordlen)) { return 1; } return 0; } function ITSecurity_CheckCB_v6($pCB)//KingKey_HOTP_CheckCB { //cMd5InputStr, cMd5ResultStr, cTmpCB; //int totoa_md5StrLen,i, iCBLen,j; $strSeamoon="KingKey20050328.88888888889999999999"; $iCBLen = strlen($pCB); $j = 0; $cTmpCB=trim($pCB) ; $pCB= $cTmpCB; $iCBLen =strlen($pCB); if(substr($pCB,6,1) == "6") { if($iCBLen != 291) { return -1; } $cMd5InputStr= $strSeamoon; $totoa_md5StrLen = strlen($strSeamoon) ; $cMd5InputStr=$cMd5InputStr . substr($pCB,0,17); $totoa_md5StrLen = $totoa_md5StrLen + 17; $cMd5InputStr=$cMd5InputStr . substr($pCB,49,strlen($pCB)); $totoa_md5StrLen = $totoa_md5StrLen + 242; $cMd5ResultStr=strtoupper(md5($cMd5InputStr)) ; if (substr($pCB,17,32)==$cMd5ResultStr) { return 1; } else { return -1; } } else { return -1; } } function KingKey_HOTP_GetInfoFromCB($pInitCB) { if(strlen($pInitCB) != 291) { return 0; } $tmpByteInit =array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); $tmpByteResult=array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); //$TmpLen; //String tmpStr; $tmpStr =substr($pInitCB,49, 289); //½âÃÜ $t = new tea(); $cg = new stringchange(); $tmpByteInit = $cg->hexStringToByte($tmpStr); $tmpByteResult = $t->decryptByTea($tmpByteInit); $tinfo=new tokeninfo(); $tinfo=$tinfo->settokeninfo($tmpByteResult); return $tinfo; } function KingKey_HOTP_GetNewCB($pcInitCB, $stTokenInfo) { //TEA encrypt $pcResultCB=$pcInitCB; $tmpByteInit =array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); $tmpByteResult=array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); $tmpByteInit = $stTokenInfo->gettokeninfo($stTokenInfo); for($i=0;$i"; } $t = new tea(); $tmpByteResult = $t->encryptByTea($tmpByteInit); $cg = new stringchange(); $tmpStr = $cg->bytesToHexString($tmpByteResult); $pcResultCB = substr($pcInitCB,0, 49) . $tmpStr . "=="; $strSNStringKey = "KingKey20050328.88888888889999999999"; $cMd5InputStr = $strSNStringKey; $cMd5InputStr = $cMd5InputStr . substr($pcInitCB,0, 17); $cMd5InputStr = $cMd5InputStr . substr($pcResultCB,49, 289); $cMd5ResultStr = strtoupper(md5($cMd5InputStr)); $pcResultCB = substr($pcResultCB,0, 17) . $cMd5ResultStr . substr($pcResultCB,49,291); return $pcResultCB; } //»ñȡλÒÆֵת»»³öÀ´µÄÌìÊý function KingKey_HOTP_GetSpaceDayBetweenLastTime($SpaceMovingValue, $IntervalInSecond) { if($SpaceMovingValue <= 0) { return 0; } if(($IntervalInSecond != 60) && ($IntervalInSecond != 30) && ($IntervalInSecond != 20)) { return 0; } $lTotalSeconds = $SpaceMovingValue * $IntervalInSecond; $TotalDays =(int)($lTotalSeconds / 86400); //Ò»Ìì86400Ãë return $TotalDays; } function GetTotalMovingValueOfNow($IntervalInSecond) { $TotalMovingValue = 0; $iTotalSeconds = 0; if(($IntervalInSecond != 60) && ($IntervalInSecond != 30) && ($IntervalInSecond != 20)) { return 0; } $TotalMovingValue =(int)( time() / $IntervalInSecond); return $TotalMovingValue; } function checkpassword($pInitCB,$pPassword) { $stHotpInfo=new tokeninfo(); //byte OTP6Len[]=new byte[6],OTP8Len[]=new byte[8]; //int iLastTimebettwenDays; //int iTimeWindow; $OTPCompareResul=1; $sg=new stringchange(); if(($pInitCB=="") || ($pPassword == "")) { return "-1"; } if(strlen($pInitCB)<200) { return "-1"; } if(substr($pInitCB,6,1) == "7") { $seaotp=new seamoonsea(); return $seaotp->checkpasswordsea($pInitCB,$pPassword); } $checkInitCBResult= $this->ITSecurity_CheckCB_v6($pInitCB); $pResultCB= $pInitCB; if($checkInitCBResult != 1) { return "-1"; } if($pInitCB[6] != "6") { return "-1"; } if(strlen($pPassword)!=6 && strlen($pPassword) !=8) { return "300"; } $stHotpInfo=$this->KingKey_HOTP_GetInfoFromCB($pInitCB); if($stHotpInfo =="") { return "-1"; } $lTotalMovingValue =$this->GetTotalMovingValueOfNow($stHotpInfo->OTPChangeTime); $iLastTimebettwenDays = $this->KingKey_HOTP_GetSpaceDayBetweenLastTime($lTotalMovingValue - $stHotpInfo->LastLoginTotalMovingValue, $stHotpInfo->OTPChangeTime ); // < 1¸öÔ if($iLastTimebettwenDays <= 30) { $iTimeWindow = 5; } else if(($iLastTimebettwenDays > 30) && ($iLastTimebettwenDays <= 90)) // 1~3¸öÔ { $iTimeWindow = 10; } else if(($iLastTimebettwenDays > 90) && ($iLastTimebettwenDays <= 180)) // 3~6¸öÔ { $iTimeWindow = 15; } else if(($iLastTimebettwenDays > 180) && ($iLastTimebettwenDays <= 360)) // 6~12¸öÔ { $iTimeWindow = 30; } else // 12¸öÔÂÒÔÉÏ { $iTimeWindow = 45; } if($stHotpInfo->OTPChangeTime==30) { $iTimeWindow = $iTimeWindow * 2; } elseif ($stHotpInfo->OTPChangeTime==20) { $iTimeWindow = $iTimeWindow * 3; } else if($stHotpInfo->OTPChangeTime==60) { $iTimeWindow = $iTimeWindow; } else { return "300"; } if($stHotpInfo->OTPType==1) { $OTPLen=6; } else { $OTPLen=8; } //$stHotpInfo->LastLoginTotalMovingValue; for($i=-1 * $iTimeWindow;$i<$iTimeWindow;$i++) { if($lTotalMovingValue + $i <= $stHotpInfo->LastLoginTotalMovingValue) { continue; } if( $this->CheckOTPpassword($stHotpInfo->Key,$stHotpInfo->OTPChangeTime,$OTPLen,$pPassword,$stHotpInfo->TokenTimeOffsetMinute +$i)==1) { $stHotpInfo->TokenTimeOffsetMinute = $stHotpInfo->TokenTimeOffsetMinute + $i; $stHotpInfo->LastLoginTotalMovingValue = $lTotalMovingValue; //get new CB $pResultCB=$this->KingKey_HOTP_GetNewCB($pInitCB, $stHotpInfo); return $pResultCB; } } return 0; } function passwordsyn($pInitCB,$pPassword) { $stHotpInfo=new tokeninfo(); //byte OTP6Len[]=new byte[6],OTP8Len[]=new byte[8]; //int iLastTimebettwenDays; //int iTimeWindow; $OTPCompareResul=1; $sg=new stringchange(); if(($pInitCB=="") || ($pPassword == "")) { return "-1"; } if(substr($pInitCB,6,1) == "7") { $seaotp=new seamoonsea(); return $seaotp->passwordsynsea($pInitCB,$pPassword); } $checkInitCBResult= $this->ITSecurity_CheckCB_v6($pInitCB); $pResultCB= $pInitCB; if($checkInitCBResult != 1) { return "-1"; } if($pInitCB[6] != "6") { return "-1"; } if(strlen($pPassword)!=6 && strlen($pPassword) !=8) { return "300"; } $stHotpInfo=$this->KingKey_HOTP_GetInfoFromCB($pInitCB); if($stHotpInfo =="") { return "-1"; } $lTotalMovingValue =$this->GetTotalMovingValueOfNow($stHotpInfo->OTPChangeTime); $iLastTimebettwenDays = $this->KingKey_HOTP_GetSpaceDayBetweenLastTime($lTotalMovingValue - $stHotpInfo->LastLoginTotalMovingValue, $stHotpInfo->OTPChangeTime ); // < 18¸öÔ if($iLastTimebettwenDays <= 540) { $iTimeWindow = 60; } else // 18¸öÔÂÒÔÉÏ { $iTimeWindow = 90; } if($stHotpInfo->OTPChangeTime==30) { $iTimeWindow = $iTimeWindow * 2; } elseif ($stHotpInfo->OTPChangeTime==20) { $iTimeWindow = $iTimeWindow * 3; } else if($stHotpInfo->OTPChangeTime==60) { $iTimeWindow = $iTimeWindow; } else { return "300"; } if($stHotpInfo->OTPType==1) { $OTPLen=6; } else { $OTPLen=8; } //$stHotpInfo->LastLoginTotalMovingValue; for($i=-1 * $iTimeWindow;$i<$iTimeWindow;$i++) { if($lTotalMovingValue + $i <= $stHotpInfo->LastLoginTotalMovingValue) { continue; } if( $this->CheckOTPpassword($stHotpInfo->Key,$stHotpInfo->OTPChangeTime,$OTPLen,$pPassword,$stHotpInfo->TokenTimeOffsetMinute +$i)==1) { $stHotpInfo->TokenTimeOffsetMinute = $stHotpInfo->TokenTimeOffsetMinute + $i; $stHotpInfo->LastLoginTotalMovingValue = $lTotalMovingValue; //get new CB $pResultCB=$this->KingKey_HOTP_GetNewCB($pInitCB, $stHotpInfo); return $pResultCB; } } return 0; } } class seamoonsea { function checkcb($pcb) { if(strlen($pcb)!=400) { return -1; } $cMd5InputStr="ShenzhenSeamoonCommunicationTechnologyCo,Ltd,20050328.88888888889999999999"; $cMd5InputStr=$cMd5InputStr . substr($pcb,0,49) . substr($pcb,81,strlen($pcb)); if(substr($pcb,49,32)==strtoupper(md5($cMd5InputStr))) { return 1; } else { return -1; } } function checkpasswordsea($pcb,$password) { if ($this->checkcb($pcb)!=1 ) { reutrn -1; } $pResultCB=array(); for($tempk=0;$tempkyear=date("Y"); $stNow->month=date("m") ; $stNow->day=date("d"); $stNow->hour= date("H") ; $stNow->minute=date("i") ; $InitDayTime->year=(ord(substr($pcb,81,1))-48) * 1000 + (ord(substr($pcb,82,1))-48) * 100 + (ord(substr($pcb,89,1))-48) * 10 + (ord(substr($pcb,90,1))-48); $InitDayTime->month=(ord(substr($pcb,112,1))-48) * 10 + (ord(substr($pcb,113,1))-48) ; $InitDayTime->day=(ord(substr($pcb,116,1))-48) * 10 + (ord(substr($pcb,117,1))-48) ; $InitDayTime->hour=(ord(substr($pcb,85,1))-48) * 10 + (ord(substr($pcb,86,1))-48) ; $InitDayTime->minute=(ord(substr($pcb,108,1))-48) * 10 + (ord(substr($pcb,109,1))-48); $InitDayTime->second=(ord(substr($pcb,120,1))-48) * 10 + (ord(substr($pcb,121,1))-48); $LastDayTime->year=(ord(substr($pcb,110,1))-48) * 1000 + (ord(substr($pcb,111,1))-48) * 100 + (ord(substr($pcb,114,1))-48) * 10 + (ord(substr($pcb,115,1))-48); $LastDayTime->month=(ord(substr($pcb,118,1))-48) * 10 + (ord(substr($pcb,119,1))-48) ; $LastDayTime->day=(ord(substr($pcb,87,1))-48) * 10 + (ord(substr($pcb,88,1))-48) ; $LastDayTime->hour=(ord(substr($pcb,106,1))-48) * 10 + (ord(substr($pcb,107,1))-48) ; $LastDayTime->minute=(ord(substr($pcb,83,1))-48) * 10 + (ord(substr($pcb,84,1))-48); $LastDayTime->second=(ord(substr($pcb,122,1))-48) * 10 + (ord(substr($pcb,123,1))-48); $iMinuteOffSet=(ord(substr($pcb,100,1))-48) * 10 + (ord(substr($pcb,101,1))-48) * 10 + (ord(substr($pcb,102,1))-48); if( substr($pcb,99,1)=="2") { $iMinuteOffSet=$iMinuteOffSet * -1; } $iSecondOffSet= (ord(substr($pcb,104,1))-48) * 10 + (ord(substr($pcb,105,1))-48); if(substr($pcb,99,1)=="2") { $iSecondOffSet=$iSecondOffSet * -1; } $ucPswType=ord(substr($pcb,224,1))-48; $ucLastLoninState=ord(substr($pcb,386,1))-48; $ucLastPsw[0]= ord(substr($pcb,225,1)); $ucLastPsw[1]= ord(substr($pcb,226,1)); $ucLastPsw[2]= ord(substr($pcb,393,1)); $ucLastPsw[3]= ord(substr($pcb,394,1)); $ucLastPsw[4]= ord(substr($pcb,395,1)); $ucLastPsw[5]= ord(substr($pcb,396,1)); $ucLastPsw[6]=0; $iPswChangeTime=(ord(substr($pcb,387,1))-48) * 1000 + (ord(substr($pcb,388,1))-48) * 100 + (ord(substr($pcb,389,1))-48) * 10 + (ord(substr($pcb,390,1))-48); $iPswActiveTime= (ord(substr($pcb,391,1))-48) * 10 + (ord(substr($pcb,392,1))-48); $ucPswActiveType=ord(substr($pcb,397,1))-48; $nowtimecount=(int)((time()-mktime($InitDayTime->hour,$InitDayTime->minute,$InitDayTime->second,$InitDayTime->month,$InitDayTime->day,$InitDayTime->year))/60); $lasttimecount=(int)( mktime($LastDayTime->hour,$LastDayTime->minute,$LastDayTime->second,$LastDayTime->month,$LastDayTime->day,$LastDayTime->year) /60-mktime($InitDayTime->hour,$InitDayTime->minute,$InitDayTime->second,$InitDayTime->month,$InitDayTime->day,$InitDayTime->year)/60); $iTimeWindow=(int)($lasttimecount/(60*24)); if($iTimeWindow<60) { $iTimeWindow=5; } else if($iTimeWindow>=60 && $iTimeWindow<360) { $iTimeWindow=30; } else { $iTimeWindow=60; } if($iPswChangeTime!=60) { return -1; } for($i=-1*$iTimeWindow;$i<=$iTimeWindow;$i++) { if (($nowtimecount + $iMinuteOffSet + $i) <=($lasttimecount + $iMinuteOffSet)) { continue; } if( $this->SMGetPsw($pucKey,$nowtimecount + $iMinuteOffSet + $i)==$password) { $pResultCB[110] =(int) ($stNow->year / 1000 ); $pResultCB[111] =(int) (($stNow->year % 1000) / 100 ); $pResultCB[114] =(int)(($stNow->year % 100) / 10 ); $pResultCB[115] =(int)((($stNow->year % 10) )); $pResultCB[118] =(int)( $stNow->month / 10); $pResultCB[119] =(int)( ($stNow->month % 10) ); $pResultCB[87] = (int)($stNow->day / 10); $pResultCB[88] = (int)(($stNow->day % 10) ); $pResultCB[106] = (int) ($stNow->hour / 10 ); $pResultCB[107] =(int)( ($stNow->hour % 10)); $pResultCB[83] =(int)( $stNow->minute / 10); $pResultCB[84] =(int)(($stNow->minute % 10)) ; $pResultCB[122] = '0'; $pResultCB[123] = '0'; //·ÖÆ«ÒÆÁ¿ $pResultCB[100] = (int) (($i + $iMinuteOffSet) / 100); $pResultCB[101] = (int) ((($i + $iMinuteOffSet) % 100) / 10); $pResultCB[102] = (int) (($i + $iMinuteOffSet) % 10); if ($i + $iMinuteOffSet > 0) { $pResultCB[99] = '1'; } else { $pResultCB[99] = '2'; } //ÃëÆ«ÒÆÁ¿ for ($i = 103; $i < 106; $i++) { $pResultCB[$i] = '0'; } $pResultCB[386] = '1'; $strSeamoon="ShenzhenSeamoonCommunicationTechnologyCo,Ltd,20050328.88888888889999999999"; $cMd5InputStr = $strSeamoon; for ($i = 0; $i < 49; $i++) { $cMd5InputStr = $cMd5InputStr . ($pResultCB[$i]); } for ($i = 0; $i < 319; $i++) { $cMd5InputStr = $cMd5InputStr . ($pResultCB[81 +$i]); } $cMd5ResultStr =strtoupper(md5($cMd5InputStr)); for ($i = 0; $i < 32; $i++) { $pResultCB[49 + $i] = substr($cMd5ResultStr,$i,1) ; } $returnstr=""; for($i=0;$i<400;$i++) { $returnstr= $returnstr . $pResultCB[$i]; } return $returnstr; } } return "0"; } function passwordsynsea($pcb,$password) { if ($this->checkcb($pcb)!=1 ) { reutrn -1; } $pResultCB=array(); for($tempk=0;$tempkyear=date("Y"); $stNow->month=date("m") ; $stNow->day=date("d"); $stNow->hour= date("H") ; $stNow->minute=date("i") ; $InitDayTime->year=(ord(substr($pcb,81,1))-48) * 1000 + (ord(substr($pcb,82,1))-48) * 100 + (ord(substr($pcb,89,1))-48) * 10 + (ord(substr($pcb,90,1))-48); $InitDayTime->month=(ord(substr($pcb,112,1))-48) * 10 + (ord(substr($pcb,113,1))-48) ; $InitDayTime->day=(ord(substr($pcb,116,1))-48) * 10 + (ord(substr($pcb,117,1))-48) ; $InitDayTime->hour=(ord(substr($pcb,85,1))-48) * 10 + (ord(substr($pcb,86,1))-48) ; $InitDayTime->minute=(ord(substr($pcb,108,1))-48) * 10 + (ord(substr($pcb,109,1))-48); $InitDayTime->second=(ord(substr($pcb,120,1))-48) * 10 + (ord(substr($pcb,121,1))-48); $LastDayTime->year=(ord(substr($pcb,110,1))-48) * 1000 + (ord(substr($pcb,111,1))-48) * 100 + (ord(substr($pcb,114,1))-48) * 10 + (ord(substr($pcb,115,1))-48); $LastDayTime->month=(ord(substr($pcb,118,1))-48) * 10 + (ord(substr($pcb,119,1))-48) ; $LastDayTime->day=(ord(substr($pcb,87,1))-48) * 10 + (ord(substr($pcb,88,1))-48) ; $LastDayTime->hour=(ord(substr($pcb,106,1))-48) * 10 + (ord(substr($pcb,107,1))-48) ; $LastDayTime->minute=(ord(substr($pcb,83,1))-48) * 10 + (ord(substr($pcb,84,1))-48); $LastDayTime->second=(ord(substr($pcb,122,1))-48) * 10 + (ord(substr($pcb,123,1))-48); $iMinuteOffSet=(ord(substr($pcb,100,1))-48) * 10 + (ord(substr($pcb,101,1))-48) * 10 + (ord(substr($pcb,102,1))-48); if( substr($pcb,99,1)=="2") { $iMinuteOffSet=$iMinuteOffSet * -1; } $iSecondOffSet= (ord(substr($pcb,104,1))-48) * 10 + (ord(substr($pcb,105,1))-48); if(substr($pcb,99,1)=="2") { $iSecondOffSet=$iSecondOffSet * -1; } $ucPswType=ord(substr($pcb,224,1))-48; $ucLastLoninState=ord(substr($pcb,386,1))-48; $ucLastPsw[0]= ord(substr($pcb,225,1)); $ucLastPsw[1]= ord(substr($pcb,226,1)); $ucLastPsw[2]= ord(substr($pcb,393,1)); $ucLastPsw[3]= ord(substr($pcb,394,1)); $ucLastPsw[4]= ord(substr($pcb,395,1)); $ucLastPsw[5]= ord(substr($pcb,396,1)); $ucLastPsw[6]=0; $iPswChangeTime=(ord(substr($pcb,387,1))-48) * 1000 + (ord(substr($pcb,388,1))-48) * 100 + (ord(substr($pcb,389,1))-48) * 10 + (ord(substr($pcb,390,1))-48); $iPswActiveTime= (ord(substr($pcb,391,1))-48) * 10 + (ord(substr($pcb,392,1))-48); $ucPswActiveType=ord(substr($pcb,397,1))-48; $nowtimecount=(int)((time()-mktime($InitDayTime->hour,$InitDayTime->minute,$InitDayTime->second,$InitDayTime->month,$InitDayTime->day,$InitDayTime->year))/60); $lasttimecount=(int)( mktime($LastDayTime->hour,$LastDayTime->minute,$LastDayTime->second,$LastDayTime->month,$LastDayTime->day,$LastDayTime->year) /60-mktime($InitDayTime->hour,$InitDayTime->minute,$InitDayTime->second,$InitDayTime->month,$InitDayTime->day,$InitDayTime->year)/60); $iTimeWindow=90; if($iPswChangeTime!=60) { return -1; } for($i=-1*$iTimeWindow;$i<=$iTimeWindow;$i++) { if (($nowtimecount + $iMinuteOffSet + $i) <=($lasttimecount + $iMinuteOffSet)) { continue; } if( $this->SMGetPsw($pucKey,$nowtimecount + $iMinuteOffSet + $i)==$password) { $pResultCB[110] =(int) ($stNow->year / 1000 ); $pResultCB[111] =(int) (($stNow->year % 1000) / 100 ); $pResultCB[114] =(int)(($stNow->year % 100) / 10 ); $pResultCB[115] =(int)((($stNow->year % 10) )); $pResultCB[118] =(int)( $stNow->month / 10); $pResultCB[119] =(int)( ($stNow->month % 10) ); $pResultCB[87] = (int)($stNow->day / 10); $pResultCB[88] = (int)(($stNow->day % 10) ); $pResultCB[106] = (int) ($stNow->hour / 10 ); $pResultCB[107] =(int)( ($stNow->hour % 10)); $pResultCB[83] =(int)( $stNow->minute / 10); $pResultCB[84] =(int)(($stNow->minute % 10)) ; $pResultCB[122] = '0'; $pResultCB[123] = '0'; //·ÖÆ«ÒÆÁ¿ $pResultCB[100] = (int) (($i + $iMinuteOffSet) / 100); $pResultCB[101] = (int) ((($i + $iMinuteOffSet) % 100) / 10); $pResultCB[102] = (int) (($i + $iMinuteOffSet) % 10); if ($i + $iMinuteOffSet > 0) { $pResultCB[99] = '1'; } else { $pResultCB[99] = '2'; } //ÃëÆ«ÒÆÁ¿ for ($i = 103; $i < 106; $i++) { $pResultCB[$i] = '0'; } $pResultCB[386] = '1'; $strSeamoon="ShenzhenSeamoonCommunicationTechnologyCo,Ltd,20050328.88888888889999999999"; $cMd5InputStr = $strSeamoon; for ($i = 0; $i < 49; $i++) { $cMd5InputStr = $cMd5InputStr . ($pResultCB[$i]); } for ($i = 0; $i < 319; $i++) { $cMd5InputStr = $cMd5InputStr . ($pResultCB[81 +$i]); } $cMd5ResultStr =strtoupper(md5($cMd5InputStr)); for ($i = 0; $i < 32; $i++) { $pResultCB[49 + $i] = substr($cMd5ResultStr,$i,1) ; } $returnstr=""; for($i=0;$i<400;$i++) { $returnstr= $returnstr . $pResultCB[$i]; } return $returnstr; } } return "0"; } function SMGetPsw($key,$iMinutes) { $i=0; for($i=0;$i> 24); $shain[$i+1]= (int)(($iMinutes & 0x00FF0000) >> 16); $shain[$i+2]= (int)(($iMinutes & 0x0000FF00) >> 8); $shain[$i+3]= (int)(($iMinutes & 0x000000FF)); $i=$i+4; $shain[$i]=0; $shain2=""; for($j=0;$j<=$i;$j++) { $shain2=$shain2 . chr($shain[$j]); } $re= sha1($shain2); $re=strtoupper($re); $sg=new stringchange(); $bytere=$sg->hexStringToByte2($re); return $this->SMGetpPswFromSha("SEAMOON20050328",1,$bytere); } function SMGetpPswFromSha($pSecret, $ucKeyType, $ucMessage_Digest ) { $i=0; $ch='1'; $ulTmpSum=array (); $ulTmpSumLen=0; $Message_Digest =array (); $ucMessage_Digest2=array (); for ($kk=0;$kk<20;$kk++) { $ucMessage_Digest2[$kk]=$ucMessage_Digest[$kk]& 0x0ff; } for ($i = 0; $i < 20; $i++) { $Message_Digest[$i] = $ucMessage_Digest2[$i]; } switch ($ucKeyType) { case 0: for ($i = 0; $i < 4; $i++) { $ulTmpSum[$i] = $Message_Digest[$i] + $Message_Digest[4 + $i] + $Message_Digest[8 + $i] + $Message_Digest[12 + $i] + $Message_Digest[16 + $i]; } $ulTmpSumLen = 4; break; case 1: case 2: for ($i = 0; $i < 4; $i++) { $ulTmpSum[$i] = $Message_Digest[$i] + $Message_Digest[6 + $i] + $Message_Digest[12 + $i]; } $ulTmpSum[4] = $Message_Digest[16] + $Message_Digest[17]; $ulTmpSum[5] = $Message_Digest[18] + $Message_Digest[19]; $ulTmpSumLen = 6; break; case 3: case 4: for ($i = 0; $i < 8; $i++) { $ulTmpSum[$i] = $Message_Digest[$i] + $Message_Digest[8 + $i] + $Message_Digest[16] + $Message_Digest[17] + $Message_Digest[18] + $Message_Digest[19]; } $ulTmpSumLen = 8; break; default: // printf(" ERROR"); return ""; } for ($i = 0; $i < $ulTmpSumLen; $i++) { switch ($ucKeyType) { case 1: case 3: switch ((int) ($ulTmpSum[$i] % 10)) { case 0: $ch = '0'; break; case 1: $ch = '1'; break; case 2: $ch = '2'; break; case 3: $ch = '3'; break; case 4: $ch = '4'; break; case 5: $ch = '5'; break; case 6: $ch = '6'; break; case 7: $ch = '7'; break; case 8: $ch = '8'; break; case 9: $ch = '9'; break; default: $ch = 'Z'; break; } break; default: switch ((int) ($ulTmpSum[$i] % 28)) { case 0: $ch = 'A'; break; case 1: $ch = 'B'; break; case 2: $ch = 'C'; break; case 3: $ch = 'D'; break; case 4: $ch = 'E'; break; case 5: $ch = 'F'; break; case 6: $ch = 'G'; break; case 7: $ch = 'H'; break; case 8: $ch = 'J'; break; case 9: $ch = 'K'; break; case 10: $ch = 'L'; break; case 11: $ch = 'M'; break; case 12: $ch = 'N'; break; case 13: $ch = 'P'; break; case 14: $ch = 'Q'; break; case 15: $ch = 'R'; break; case 16: $ch = 'S'; break; case 17: $ch = 'T'; break; case 18: $ch = 'W'; break; case 19: $ch = 'X'; break; case 20: $ch = 'Y'; break; case 21: $ch = '3'; break; case 22: $ch = '4'; break; case 23: $ch = '5'; break; case 24: $ch = '6'; break; case 25: $ch = '7'; break; case 26: $ch = '8'; break; case 27: $ch = '9'; break; default: $ch = 'Z'; break; } break; } $psw =$psw . $ch; } return $psw; } } ?>