加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

用php实现php代码的加密解密类分享

发布时间:2022-02-24 13:36:09 所属栏目:PHP教程 来源:互联网
导读:php 代码加密类,大家可以根据自己的需求进行修改,原类如下,希望能分享给大家。本次在ubuntu下测试没有问题。 ?php class Encryption{ private $c=;//存储密文 private $s=,$q1,$q2,$q3,$q4,$q5,$q6;//存储生成的加密后的文件内容 //如果不设置一个值,i
  php 代码加密类,大家可以根据自己的需求进行修改,原类如下,希望能分享给大家。本次在ubuntu下测试没有问题。
 
  <?php   
      class Encryption{   
          private $c='';//存储密文   
          private $s='',$q1,$q2,$q3,$q4,$q5,$q6;//存储生成的加密后的文件内容   
          //如果不设置一个值,isset会表示不存在;   
          private $file='';//读取文件的路径   
          private $source='',$target='';
          //构造函数,实例化时调用初始化全局变量;   
          public function __construct(){   
              //初始化全局变量   
              $this->initialVar();   
              //echo "hello /n";   
          }   
          /*  
          *@input  $property_name,$value  
          *@output   
          *   魔法方法,对变量进行设置值;可根据需求进行处理。若直接去除if判断表示可用设置任何属性的值,包括不存在的属性;
          */   
          public function __set($property_name,$value){   
              //定义过的变量;   
              if(isset($this->$property_name)){   
                  $this->$property_name = $value;   
              }else{   
                  //异常处理,处理未声明的变量赋值;可根据需求进行处理。   
                  throw new Exception("property does not exist");   
              }   
          }   
          //魔法方法 取出变量的值;   
          public function __get($property_name){   
              if(isset($this->$property_name)){   
                  return $this->$property_name;   
              }else{   
                  //throw new Exception("property does not exist");   
                  return NULL;   
              }   
          }   
          //取随机排序   
          private function RandAbc($length=""){//随机排序取回   
            $str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";   
            return str_shuffle($str);   
          }   
          //对明文内容进行加密处理
          private function ciphertext($filename){   
              //$filename='index.php';   
              $T_k1=$this->RandAbc();   
              $T_k2=$this->RandAbc();   
              $vstr=file_get_contents($filename);   
              $v1=base64_encode($vstr);   
              $c=strtr($v1,$T_k1,$T_k2);
              $this->c=$T_k1.$T_k2.$c;   
              return $this;   
          }
          //初始化变量   
          private function initialVar(){   
              $this->q1="O00O0O";//base64_decode   
              $this->q2="O0O000";//$c(原文经过strtr置换后的密文,由 目标字符+替换字符+base64_encode(‘原文内容’)构成)   
              $this->q3="O0OO00";//strtr   
              $this->q4="OO0O00";//substr   
              $this->q5="OO0000";//52   
              $this->q6="O00OO0";//urldecode解析过的字符串(n1zb/ma5/vt0i28-pxuqy*6%6Crkdg9_ehcswo4+f37j)
  
          }   
          //生成加密后的模板(复杂版本);   
          private function model(){   
              //$c = $this->c;
              //$this->initialVar();   
              $this->s='<?php $'.$this->q6.'=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$'.   
              $this->q1.'=$'.$this->q6.'{3}.$'.$this->q6.'{6}.$'.$this->q6.'{33}.$'.$this->q6.'{30};$'.$this->q3.'=$'.$this->q6.'{33}.$'.$this->q6.'{10}.$'   
              .$this->q6.'{24}.$'.$this->q6.'{10}.$'.$this->q6.'{24};$'.$this->q4.'=$'.$this->q3.'{0}.$'.$this->q6.'{18}.$'.$this->q6.'{3}.$'.$this->q3.'{0}   
              .$'.$this->q3.'{1}.$'.$this->q6.'{24};$'.$this->q5.'=$'.$this->q6.'{7}.$'.$this->q6.'{13};$'.$this->q1.'.=$'.$this->q6.'{22}.$'.$this->q6.'{36}   
              .$'.$this->q6.'{29}.$'.$this->q6.'{26}.$'.$this->q6.'{30}.$'.$this->q6.'{32}.$'.$this->q6.'{35}.$'.$this->q6.'{26}.$'.$this->q6.'{30};   
              eval($'.$this->q1.'("'.base64_encode('$'.$this->q2.'="'.$this->c.'";
              eval(/'?>/'.$'.$this->q1.'($'.$this->q3.'($'.$this->q4.'($'.$this->q2.',$'.$this->q5.'*2),$'.$this->q4.'($'.$this->q2.',$'.$this->q5.',$'.$this->q5.'),   
              $'.$this->q4.'($'.$this->q2.',0,$'.$this->q5.'))));').'"));?>';   
              return $this;   
          }
          //创建加密文件   
          private function build($target){
              //$this->encodes("./index.php");   
              //$this->model();   
              $fpp1 = fopen($target,'w');   
              fwrite($fpp1,$this->s) or die('写入是失败!');
              fclose($fpp1);
              return $this;   
          }   
          //加密处理 连贯操作   
          public function encode($file,$target){   
              //$file = "index.php";   
              //连贯操作其实就是利用函数处理完后返回自身   
              $this->ciphertext($file)->model()->build($target);
              echo 'encode------'.$target.'-----ok<br/>';   
          }   
          //解密   
          public function decode($file,$target=''){
              //读取要解密的文件
              $fpp1 = file_get_contents($file);
              $this->decodeMode($fpp1)->build($target);
              echo 'decode------'.$target.'-----ok<br/>';
          }
          //解密模板,得到解密后的文本
          private function decodeMode($fpp1){
              //以eval为标志 截取为数组,前半部分为密文中的替换掉的函数名,后半部分为密文
              $m = explode('eval',$fpp1);
              //对系统函数的替换部分进行执行,得到系统变量
              $varStr = substr($m[0],strpos($m[0],'$'));
              //执行后,后续就可以使用替换后的系统函数名
              eval($varStr);
              //判断是否有密文
              if(!isset($m[1])){
                  return $this;
              }
  
              //对密文进行截取 {$this->q4}  substr
              $star =  strripos($m[1],'(');
              $end = strpos($m[1],')');
              $str = ${$this->q4}($m[1],$star,$end);
              //对密文解密 {$this->q1}  base64_decode
              $str = ${$this->q1}($str);
              //截取出解密后的  核心密文
              $evallen = strpos($str,'eval');
              $str = substr($str,0,$evallen);
              //执行核心密文 使系统变量被赋予值 $O0O000
              eval($str);
              //并不能将如下段封装,因为 ${$this->qn} 并不能在全文中起作用
              $this->s = ${$this->q1}(
                  ${$this->q3}(
                      ${$this->q4}(
                          ${$this->q2},${$this->q5}*2
                      ),
                      ${$this->q4}(
                          ${$this->q2},${$this->q5},${$this->q5}
                      ),
                      ${$this->q4}(
                          ${$this->q2},0,${$this->q5}
                      )
                  )
              );
              return $this;
          }
          //递归读取并创建目标目录结构
          private function targetDir($target){
              if(!emptyempty($target) )  {
                  if(!file_exists($target)){
                      mkdir($target,0777,true);
                  }else{
                      chmod($target,0777);
                  }
  
              }
          }
  
          //递归解密 对指定文件夹下的php文件解密   
          public function decodeDir($source,$target=""){
              if(is_dir($source)){
                  $this->targetDir($target);
                  $dir = opendir($source);   
                  while(false!=$file=readdir($dir))   
                  {   
                      //列出所有文件并去掉'.'和'..' 此处用的实例为thinkphp框架,所以默认排除里Thinkphp目录,用户可以按照自己的需求设置
                      if($file!='.' && $file!='..' && $file !='ThinkPHP')
                      {   
                          $path = $target.DIRECTORY_SEPARATOR.$file;   
                          $sourcePath =  $source.DIRECTORY_SEPARATOR.$file;   
                          $this->decodeDir($sourcePath,$path);   
                      }   
                  }   
             
              }else if(is_file($source)){   
                  $extension=substr($source,strrpos($source,'.')+1);   
                  if(strtolower($extension)=='php'){
                      $this->decode($source,$target);   
                  }else{   
                      //不是php的文件不处理   
                      copy($source, $target);   
                  }   
                  //return;   
              }
          }   
          //递归加密 对指定文件夹下的php文件加密   
          public function encodeDir($source,$target){
              if(is_dir($source)){
                  $this->targetDir($target);
                  $dir = opendir($source);   
                  while(false!=$file=readdir($dir))   
                  {   
                      //列出所有文件并去掉'.'和'..'
                      if($file!='.' && $file!='..' && $file !='ThinkPHP')
                      {   
                          $path = $target.DIRECTORY_SEPARATOR.$file;   
                          $sourcePath =  $source.DIRECTORY_SEPARATOR.$file;   
                          $this->encodeDir($sourcePath,$path);   
                      }   
                  }   
  
              }else if(is_file($source)){
                  $extension=substr($source,strrpos($source,'.')+1);
                  if(strtolower($extension)=='php'){
                      $this->encode($source,$target);
                  }else{   
                      copy($source, $target);   
                  }
              }   
          }
      }   
      $ob = new Encryption();   
      $ob->source = "/var/www/bookReservation";
      $ob->target = "/var/www/jiami/bookReservation";
      //解密指定文件   
      //$ob->decode('D://php//WWW//workspace//weixin2//Application//Home//Controller//IndexController.class.php');   
       //Cuoxin.com
      //$ob->decode('jiami.php');   
      //$ob->decode('dam6.php');   
      //对一个指定的文件目录进行加密   
      $ob->encodeDir($ob->source,$ob->target);
      //对一个指定的文件目录进行解密
      $ob->decodeDir($ob->target,"/var/www/jiami/bookReservationD"); 

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读