<?php
if(!defined('IN_TM')) exit('Access Denied');
class encrypt{
    function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {           $ckey_length = 4;	                      $key = md5($key ? $key : TM_KEY);            $keya = md5(substr($key, 0, 16));            $keyb = md5(substr($key, 16, 16));            $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';            $cryptkey = $keya.md5($keya.$keyc);            $key_length = strlen($cryptkey);            $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);            $result = '';            $box = range(0, 255);            $rndkey = array();            for($i = 0; $i <= 255; $i++) {		$rndkey[$i] = ord($cryptkey[$i % $key_length]);            }            for($j = $i = 0; $i < 256; $i++) {		$j = ($j + $box[$i] + $rndkey[$i]) % 256;		$tmp = $box[$i];		$box[$i] = $box[$j];		$box[$j] = $tmp;            }            for($a = $j = $i = 0; $i < $string_length; $i++) {		$a = ($a + 1) % 256;		$j = ($j + $box[$a]) % 256;		$tmp = $box[$a];		$box[$a] = $box[$j];		$box[$j] = $tmp;		$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));            }            if($operation == 'DECODE') {		if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {			return substr($result, 26);		} else {			return '';		}            }else {		return $keyc.str_replace('=', '', base64_encode($result));            }        }
	function encode($txt, $key) {		srand((double)microtime() * 1000000);		$encrypt_key = md5(rand(0, 32000));		$ctr = 0;		$tmp = '';		for($i = 0;$i < strlen($txt); $i++) 		{			$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;			$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);		}		return $this->Hex(base64_encode($this->key($tmp, $key)));	}
	function decode($txt, $key) {		$txt = $this->key(base64_decode($this->fromHex($txt)), $key);		$tmp = '';		for($i = 0;$i < strlen($txt); $i++) 		{			$md5 = $txt[$i];			$tmp .= $txt[++$i] ^ $md5;		}		return $tmp;	}
	function key($txt, $encrypt_key) {		$encrypt_key = md5($encrypt_key);		$ctr = 0;		$tmp = '';		for($i = 0; $i < strlen($txt); $i++) 		{			$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;			$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];		}		return $tmp;	}	
	function Hex($sa) {		$buf = "";		for ($i = 0; $i < strlen($sa); $i++)		{			$val = dechex(ord($sa{$i}));			if(strlen($val)< 2) 				$val = "0".$val;			$buf .= $val;		}		return $buf;	}
	function fromHex($sa){		$buf = "";		for($i = 0; $i < strlen($sa); $i += 2)		{			$val = chr(hexdec(substr($sa, $i, 2)));			$buf .= $val;		}		return $buf;	}
}
/*
$txt = '²âÊÔ¼ÓÃÜ×Ö·û´®';
$key = '²âÊÔÃÜÔ¿';
$a = new encrypt();
$encrypt = $a->encode($txt,$key);
$decrypt = $a->decode($encrypt,$key);
*/
?>