<?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==0 || $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===1 && $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' ? 1 : 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;
}
}