<?php
namespace imcat;

// 编码转化,加密类
class comConvert{                  
    
    
// 创建rsa公私密钥对
    
static function rsapk($cfg=[]){ 
        
$config = array(
            
//"digest_alg" => "sha512",
            
"private_key_bits" => 1024//字节数:512, 1024, 2048, 4096 等
            
"private_key_type" => OPENSSL_KEYTYPE_RSA//加密类型
        
);
        if(!empty(
$cfg['openssl_cnf']) && file_exists($cfg['openssl_cnf'])){
            
$config['config'] = $cfg['openssl_cnf'];
        }
        
//创建公私钥
        
$res openssl_pkey_new($config);
        
//获取私钥
        
$passKey = empty($cfg['pass']) ? null $cfg['pass'];
        
openssl_pkey_export($res$private_key$passKey$config);
        
//获取公钥
        
$public_key openssl_pkey_get_details($res)['key'];
        
//组合rsa
        
$rsa = [
            
'public_key' => $public_key,
            
'private_key' => $private_key,
        ];
        return 
$rsa;
    }

    
// 加载-table数据
    
static function impData($data,$part=''){   
        
$f1 'start(!@~)'$f2 '(!@~)isend'$f0 '(split!@~flag)'// 标记 
        
if(empty($data)) return '';
        
$p1 strpos($data,$f1); $p2 strpos($data,$f2);
        if(
$p1$data substr($data,$p1+10,$p2-$p1+10);
        if(
$part){
            
$len strlen($part)+2;
            
$p1 strpos($data,"[$part]")+$len$p2 strpos($data,"[/$part]");
            
$data = ($p1 && $p2) ? substr($data,$p1,$p2-$p1) : '';
        }
        if(
strpos($data,$f0)>0$data explode($f0,$data);
        return 
$data;  
    } 
    
    
// 自动转换字符集 支持数组转换
    
static function autoCSet($str,$from='gbk',$to='utf-8'){
        if(empty(
$str) || empty($from) || empty($to)) return $str;
        
$from strtoupper($from)=='UTF8''utf-8':$from;
        
$to strtoupper($to)=='UTF8''utf-8':$to;
        if( 
strtoupper($from) === strtoupper($to) || (is_scalar($str) && !is_string($str)) ){
            return 
$str//如果编码相同或者非字符串标量则不转换
        
}
        if(
is_string($str) ) {
            if(
function_exists('iconv')){
                return 
iconv($from,$to."//IGNORE",$str); 
            }elseif(
function_exists('mb_convert_encoding')){
                return 
mb_convert_encoding ($str$to$from);
            }else{
                return 
$str;
            }
        }elseif(
is_array($str)){
            foreach ( 
$str as $key => $val ) {
                
$str[$key] = self::autoCSet($val,$from,$to);
                
// 不考虑key转化
            
}
            return 
$str;
        }else{
            return 
$str;
        }
    }
    
    
// sn:3369512d-e369-czyx-xmao-2016-5w76dm47
    
static function sysSn($area='czyx',$corp='xmao'){ 
        
$time str_replace('-','',basKeyid::kidTemp('6'));
        
$enc md5("$area.$time.$corp");
        
$res substr($enc,7,8).'-'.substr($enc,23,4);
        
$res .= "-$area-$corp-";
        
$res .= substr($time,0,4).'-'.substr($time,4,8);
        return 
$res;
    }
    
    static function 
sysPass($uid='',$upw='',$mod=''){
        global 
$_cbase;
        if(empty(
$uid) || empty($upw)) return '(null)';
        
$pfix $mod=='adminer' $_cbase['safe']['pass'].$mod 'pass';
        return 
self::sysEncode("$upw@$uid",$pfix,24);
    }
    
// *** 加密MD5
    // $methods:md5,sha1,(md5比sha1快点)
    // $ukey = in_array($ukey,array('pass','form','api','js','other'))
    
static function sysEncode($str,$ukey='other',$len=16){ # ,$methods='md5,sha1'
        
global $_cbase;
        
$safe $_cbase['safe'];
        
$str md5($str);
        
$str sha1($str);
        
$str sha1($str);
        
$ukey || $ukey 'other';
        
$ukey = isset($safe[$ukey]) ? $safe[$ukey] : $ukey;
        
$skey $safe['site']; 
        
$ostr "$skey@$str@$len@$ukey";
        
$str sha1($ostr).hash('ripemd128',$ostr); // 72位
        
$len || $len 16;
        return 
substr($str,(strlen($str)-$len)/2,$len); 
    }
    
    
//加密解密,$key:密钥;$de:是否解密;$expire 过期时间
    
static function sysRevert($str$de=0$key=''$exp=0){
        global 
$_cbase;
        
$key || $key $_cbase['safe']['other']; 
        
$nn 4$key md5($key); $res '';
        
$keya md5(substr($key,0,16)); $keyb md5(substr($key,16,16));
        if(
$de){
            
$str str_replace(array('-','_',),array('+','/',),$str);
            
$keyc substr($str,0,$nn);
            
$ckey $keya.md5($keya.$keyc); $ckn strlen($ckey);
            
$str =  base64_decode(substr($str,$nn));
        }else{
            
$str serialize($str);
            
$keyc substr(md5($_SERVER["REQUEST_TIME"]), -$nn);
            
$ckey $keya.md5($keya.$keyc); $ckn strlen($ckey);
            
$str =  sprintf('%010d'$exp $exp+$_SERVER["REQUEST_TIME"] : 0).substr(md5($str.$keyb),0,16).$str;
        }
        
$mm strlen($str); $box range(0,255); $rnd = array();
        for(
$i=0$i<=255$i++){ 
            
$rnd[$i] = ord($ckey[$i $ckn]);
        }
        for(
$j=$i=0$i<256$i++) {
            
$j = ($j $box[$i] + $rnd[$i]) % 256;
            
$tmp $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp;
        }
        for(
$a=$j=$i=0$i<$mm$i++) {
            
$a = ($a 1) % 256;
            
$j = ($j $box[$a]) % 256;
            
$tmp $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp;
            
$res .= chr(ord($str[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }
        if(
$de){
            
$ires intval(substr($res,0,10));
            if(
$ires==|| $ires-$_SERVER["REQUEST_TIME"]>0) {
                return @
unserialize(substr($res,26));
            }
            return 
'';
        }else{
            
$res base64_encode($res); 
            return 
$keyc.str_replace(array('+','/','='),array('-','_',''),$res);
        }
    }
    
    
//base64编码(并加密/解密)
    
static function sysBase64($s,$de=0,$key=''){
        global 
$_cbase;
        if(empty(
$s)) return $s;
        
$safe $_cbase['safe'];
        
$org basKeyid::kidRTable('f','org');
        
$rnd $safe['rndtab'].'.-'$re ''
        
$fix = ($key $key $safe['rndch6'])."^";
        if(
$de){ 
            for(
$i=0;$i<strlen($s);$i++){
                
$ch substr($s,$i,1); $p strpos($rnd,$ch); 
                
$re .= $p===false $ch substr($org,$p,1); 
            }
            
$s $re;
        }else{
            
$s $fix.$s;    
        }
        
$s comParse::urlBase64($s,$de); 
        if(
$de){ 
            
$s substr($s,strlen($fix));
        }else{
            for(
$i=0;$i<strlen($s);$i++){
                
$ch substr($s,$i,1); $p strpos($org,$ch); 
                
$re .= $p===false $ch substr($rnd,$p,1); 
            }
            
$s $re;
        }
        return 
$s;
    }

    static function 
jianfanMain($str,$type='j2f',$cset='3'){
        
$jf=""$p 0$len strlen($str);
        if(
$type=='j2f'){
            
$tab1 self::jfcfgTab('Jian');
            
$tab2 self::jfcfgTab('Fan');
        }else{
            
$tab2 self::jfcfgTab('Jian');
            
$tab1 self::jfcfgTab('Fan');
        }
        for(
$i=0;$i<$len;$i++){   
            
$ch substr($str,$p,1);
            if(
ord($ch)<128){ 
                
$jf .= $ch;
                
$p++;
            }else{
                
$ch substr($str,$p,$cset);
                
$tp strpos($tab1,",$ch"); 
                if(
$tp$ch substr($tab2,$tp+1,$cset);
                
$jf .= "$ch";  
                
$p += $cset
            }
            if(
$p>=$len) break;
        }   
        return 
$jf
    }
    
    static function 
pinyinOne($chr){
        
$tab self::pycfgTab();
        
$p strpos($tab,$chr); 
        
$t substr($tab,0,$p);
        
$t strrchr($t,"(");
        
$p strpos($t,")");
        
$t substr($t,1,$p-1);
        return 
$t;   
    }
    
// 内页广告: 0-neiyeguanggao, 1-n, 9-nygg
    
static function pinyinMain($str,$cset='3',$first=0){
        
$cset $cset=='3' 'utf-8' 'gbk';
        
$arr basStr::strArr($str$cset);
        
$len count($arr); $py=""
        for(
$i=0;$i<$len;$i++){
            if(
ord($arr[$i])<128){
                
$py .= preg_replace("/\W/",'_',$arr[$i]);
            }else{
                
$tmp self::pinyinOne($arr[$i]); 
                
$py .= $first substr($tmp,0,1) : $tmp;
            }
            if(
$first===&& $py) return substr($py,0,1); 
        }
        return 
$py
    }
    
    static function 
jfcfgTab($key){
        static 
$jfcfg_tab;
        if(!isset(
$jfcfg_tab)){
            
$file DIR_STATIC.'/ximp/utabs/jianfan.imp_txt';
            
$tmp comFiles::get($file);
            
$tmp explode('(split!@~flag)',$tmp);
            
$jfcfg_tab[0] = trim($tmp[1]);
            
$jfcfg_tab[1] = trim($tmp[2]);
            unset(
$tmp); 
        }
        
$id $key=='Fan' 0;
        return 
$jfcfg_tab[$id];
    }
    static function 
pycfgTab(){
        static 
$pycfg_tab;
        if(!isset(
$pycfg_tab)){
            
$file DIR_STATIC.'/ximp/utabs/pinyin.imp_txt';
            
$pycfg_tab comFiles::get($file);
        }
        return 
$pycfg_tab;
    }

}