基于php实现的php代码加密解密类完整实例


Posted in PHP onOctober 12, 2016

本文实例讲述了基于php实现的php代码加密解密类。分享给大家供大家参考,具体如下:

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(!empty($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');
//$ob->decode('jiami.php');
//$ob->decode('dam6.php');
//对一个指定的文件目录进行加密
$ob->encodeDir($ob->source,$ob->target);
//对一个指定的文件目录进行解密
$ob->decodeDir($ob->target,"/var/www/jiami/bookReservationD");

PHP 相关文章推荐
PHP 日志缩略名的创建函数代码
May 26 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
ThinkPHP模版中导入CSS和JS文件的方法
Nov 29 PHP
php+ajax制作无刷新留言板
Oct 27 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
Mar 11 PHP
php处理单文件、多文件上传代码分享
Aug 24 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
php 无限分类 树形数据格式化代码
Oct 11 #PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 #PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 #PHP
php外部执行命令函数用法小结
Oct 11 #PHP
php字符串操作常见问题小结
Oct 11 #PHP
You might like
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
文件上传的实现
2006/10/09 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
浅谈laravel框架与thinkPHP框架的区别
2019/10/23 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
javascript闭包的理解和实例
2010/08/12 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
jquery监控数据是否变化(修正版)
2011/04/12 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python批量获取并保存手机号归属地和运营商的示例
2020/10/09 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
什么是lambda函数
2013/09/17 面试题
银行实习生的自我评价
2014/01/13 职场文书
5.1手机促销活动
2014/01/17 职场文书
《猫》教学反思
2014/02/26 职场文书
有趣的广告词
2014/03/18 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书