Files
xinhu/include/chajian/jmChajian.php
2022-08-14 16:47:40 +08:00

290 lines
6.2 KiB
PHP

<?php
/**
加密解密插件
*/
class jmChajian extends Chajian{
private $keystr = 'abcdefghijklmnopqrstuvwxyz';
private $jmsstr = '';
public $rocktokenarr = array();
protected function initChajian()
{
$this->initJm();
}
public function initJm()
{
$this->jmsstr = getconfig('randkey');
$this->setRandkey($this->jmsstr);
$this->getkeyshow();
}
public function setRandkey($str)
{
$this->jmsstr = $str;
if(strlen($this->jmsstr)!=26)$this->jmsstr = $this->keystr;
$this->getrocktoken();
}
public function getRandkey()
{
$str = $this->keystr;
$s = '';$len = strlen($str);
$j = $len-1;
for($i=0; $i<$len; $i++){
$r = rand(0, $j);
$zm= substr($str, $r, 1);
$s.= $zm;
$str = str_replace($zm,'',$str);
$j--;
}
return $s;
}
public function getint($str)
{
$len = strlen($str);
$oi = 0;
for($i=0; $i<$len; $i++){
$l = substr($str,$i,1);
$j = ord($l)-90;
$oi+=$j;
}
if($oi<0)$oi=0-$oi;
return $oi;
}
private function getrandstr($oi, $str='')
{
if($str=='')$str=$this->keystr;
if($oi>100)$oi=100;
$len = strlen($str);
$qs = 6;
$s1 = substr($str, 0, $qs);
$s2 = substr($str, $qs, $qs);
$s3 = substr($str, $qs*2, $len-$qs*2);
$s = $s3.$s2.$s1;
if($oi>0)$s=$this->getrandstr($oi-1, $s);
return $s;
}
public function getkeyshow()
{
$str = '~!@#$%^&*()_+{}[];"<>?:-=.';
$len = strlen($this->jmsstr);
$s = '';
for($i=0;$i<$len;$i++){
$l = substr($this->jmsstr,$i,1);
$j = ord($l)-97;
$s.= substr($str,$j,1);
}
return $s;
}
public function base64encode($str)
{
if(isempt($str))return '';
$str = base64_encode($str);
$str = str_replace(array('+', '/', '='), array('!', '.', ':'), $str);
return $str;
}
public function base64decode($str)
{
if(isempt($str))return '';
$str = str_replace(array('!', '.', ':'), array('+', '/', '='), $str);
$str = base64_decode($str);
return $str;
}
private function _getss($lx)
{
$st = '';
if(is_numeric($lx)&&$lx>0){
$st = $this->getrandstr($lx);
}else if(is_string($lx)){
if(strlen($lx)==26)$st=$lx;
}
return $st;
}
public function encrypt($str, $lx='')
{
$st = $this->_getss($lx);
$s = $this->base64encode($str);
$s = $this->encrypts($s, $st);
return $s;
}
public function uncrypt($str, $lx='')
{
$st = $this->_getss($lx);
$s = $this->uncrypts($str, $st);
$s = $this->base64decode($s);
return $s;
}
public function encrypts($str, $a='')
{
if($a=='')$a = $this->jmsstr;
$nstr = '';
if($this->rock->isempt($str)) return $nstr;
$len = strlen($str);
$t = rand(1, 14);
if($t == 10)$t++;
for($i=0; $i<$len; $i++){
$nstr.='0';
$sta = substr($str,$i,1);
$orstr = ''.ord($sta).'';
$ile = strlen($orstr);
for($j=0; $j<$ile; $j++){
$oi = (int)substr($orstr,$j,1)+$t;
$nstr.= substr($a,$oi,1);
}
}
if($nstr != ''){
$nstr = substr($nstr,1);
$nstr.= '0'.$t.'';
}
return $nstr;
}
public function uncrypts($str, $a1='')
{
$nstr = '';
if($this->rock->isempt($str)) return $nstr;
if($a1=='')$a1 = $this->jmsstr;
$a = array();
for($i=0; $i<strlen($a1); $i++)$a[substr($a1, $i, 1)] = ''.$i.'';
$na = explode('0', $str);
$len= count($na);
$r = (int)$na[$len-1];
for($i=0; $i<$len-1; $i++){
$st = $na[$i];
$sl = strlen($st);
$sa = '';
for($j=0; $j<$sl; $j++){
$ha = substr($st,$j,1);
if(isset($a[$ha]))$ha = $a[$ha] - $r;
$sa.=$ha;
}
$sa = (int)$sa;
$nstr.=chr($sa);
}
return $nstr;
}
public function getrocktoken()
{
$toke = $this->rock->get('rocktoken');
$str = $this->uncrypt($toke);
if($toke!='' && !$this->contain($str,'&'))exit('sorry,not found!');
$arr = array('m'=>'index','a'=>'default','d'=>'');
if($str){
$a = explode('&', $str);
foreach($a as $a1){
$a2 = explode('=', $a1);
$arr[$a2[0]] = $a2[1];
}
}
$this->rocktokenarr = $arr;
return $arr;
}
public function gettoken($na, $dev='')
{
$s = $dev;
if(isset($this->rocktokenarr[$na])){
$s = $this->rocktokenarr[$na];
}else{
$s = $this->rock->get($na, $dev);
}
return $s;
}
public function strrocktoken($a=array())
{
$s = '';
foreach($a as $k=>$v){
$s .='&'.$k.'='.$v.'';
}
if($s!=''){
$s = $this->encrypt(substr($s, 1));
}
return $s;
}
public function mcrypt_encrypt($str)
{
if(isempt($str))return '';
if(!function_exists('mcrypt_encrypt'))return $str;
$key = substr(md5($this->jmsstr),0,8);
$getstr = mcrypt_encrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB);
return $this->base64encode($getstr);
}
public function mcrypt_decrypt($str)
{
if(isempt($str))return '';
if(!function_exists('mcrypt_decrypt'))return $str;
$str = $this->base64decode($str);
$key = substr(md5($this->jmsstr),0,8);
$getstr = mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB);
return trim($getstr);
}
/**
* 字符串加密处理
*/
public function strlook($data,$key='')
{
if(isempt($data))return '';
if($key=='')$key = md5($this->jmsstr);
$x = 0;
$len = strlen($data);
$l = strlen($key);
$char = $str = '';
for ($i = 0; $i < $len; $i++){
if ($x == $l) {
$x = 0;
}
$char .= $key[$x];
$x++;
}
for ($i = 0; $i < $len; $i++){
$str .= chr(ord($data[$i]) + (ord($char[$i])) % 256);
}
return $this->base64encode($str);
}
/**
* 字符串解密
*/
public function strunlook($data,$key='')
{
if(isempt($data))return '';
if($key=='')$key = md5($this->jmsstr);
$x = 0;
$data = $this->base64decode($data);
$len = strlen($data);
$l = strlen($key);
$char = $str = '';
for ($i = 0; $i < $len; $i++){
if ($x == $l) {
$x = 0;
}
$char .= substr($key, $x, 1);
$x++;
}
for ($i = 0; $i < $len; $i++){
if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))){
$str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
}else{
$str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
}
}
return $str;
}
}