使用此加密必需載入並開啟bcompiler的ext,安裝可參考http://www.php.net/manual/en/bcompiler.installation.php

公司最近說要將PHP原始碼加密@_@,我之前壓根都沒想到這事,所以今天花了一整天拜請google大仙,找到有一種使用bcompiler的方法,趴了官方文件後,索性就寫了一個加密的class,或許以會有機會用到。

//載入函式
include_once('phpCodeZip.php');
//建立加密物件
$encryption  = new PhpCodeZip('sourceDir','targetDir');
//執行加密
$encryption->zip();
//如此一來,你就可以在targetDir找到經過加密的PHP原始碼
/**
 * @author:SANKAI
 * @license:MIT & GPL
 **/
class PhpCodeZip{
    //欲進行壓縮加密的來源資料夾
    var $sourceDir = '.';
    //進行壓縮加密的存放的資料夾
    var $targetDir = 'tmp';
    //是否進行加密
    var $bcompiler = true;
    //是否去除空白註解斷行
    var $strip = true;
    //來源資料夾檔案路徑陣列
    var $sourcefilePaths = array();
    //目的資料夾檔案路徑陣列
    var $targetPaths = array();
    //進行壓縮加密前的資料夾大小
    var $sizeBeforeZip = null;
    //進行壓縮加密後的資料夾大小
    var $sizeAfterZip = null;
    //斷行的輸出
    var $newline = '';
/**
 *  建構子
 *
 * @param string $sourceDir 來源資料夾
 * @param string $targetDir 目的資料夾
 * @param boolean $bcompiler 是否進行加密
 * @param boolean $strip 是否去除空白註解斷行
 * @return boolean
 */
    public function PhpCodeZip($sourceDir='.',$targetDir='tmp',$bcompiler=true,$strip=true){
        //配置初始變數
        $this->sourceDir = $sourceDir;
        $this->targetDir = $targetDir;
        $this->bcompiler = $bcompiler;
        //檢查來源資料是否存在

        if(!is_dir($this->sourceDir)){
            die('指定的來源資料夾'.$this->sourceDir.'不存在,請重新設定');
        } else {
            //如果指定的目的資料夾存在,砍掉重練
            if(is_dir($this->targetDir)){
                echo '【初始化目的地資料夾】'.$this->newline.$this->newline;
                $this->cleanDir($this->targetDir,true);
            }
            //建立與來源資料夾結構一樣的目的資料夾
            mkdir($this->targetDir,0777);
            $dir_paths = $this->getPaths($this->sourceDir,'*',GLOB_ONLYDIR);
            foreach($dir_paths as $key => $path){
                $path = explode('/',$path);
                $path[0] = $this->targetDir;
                echo '=> '.join('/',$path).$this->newline;
                mkdir(join('/',$path),0777);
            }
            //取得來源資料夾的檔案路徑清單
            $this->sourcefilePaths = $this->getPaths($this->sourceDir,'*');
            //配對應目的地的檔案路徑清單
            foreach($this->sourcefilePaths as $key => $path){
                //設定目的資料夾檔案路徑
                $path = explode('/',$path);
                $path[0] = $this->targetDir;
                $this->targetPaths[$key] = join('/',$path);
            }
            //記錄執行前的資料夾大小
            $this->sizeBeforeZip = $this->getSizeUnit($this->getDirSize($this->sourceDir),2);
            echo $this->newline.$this->newline;
        }
    }
/**
 *  進行壓縮加密
 * @return boolean
 */
    public function zip(){
        $this->newline = '';
        echo '【開始進行加密程序】(資料夾大小:'.$this->sizeBeforeZip.')'.$this->newline.$this->newline;
        //將來源檔案進行壓縮
        foreach($this->sourcefilePaths as $key => $path){
            if(is_file($path)){
                //取得檔案資訊
                $pathInfo = pathInfo($path);
                echo '讀取來源檔:'.$path.$this->newline;
                //取得壓縮後的內容
                echo '=>去除空白註解..........';
                if($this->strip && $pathInfo['extension'] == 'php'){
                    $fileAterZip = php_strip_whitespace($path);
                } else {
                    $fileAterZip = file_get_contents($path);
                }
                echo '完畢'.$this->newline;

                //取壓縮後的內容寫到目的位置
                $fp = fopen($this->targetPaths[$key],'w+');
                echo '=>寫入目的檔..........';
                fwrite($fp,$fileAterZip);
                fclose($fp);
                echo '完畢'.$this->newline;
                //是否若選擇進行加密
                if($this->bcompiler && $pathInfo['extension'] == 'php'){
                    echo '=>加密原始檔..........';
                    //複製原始檔
                    $fh = fopen($this->targetPaths[$key].'encrypt.php', "w");
                    bcompiler_write_header($fh);
                    bcompiler_write_file($fh, $this->targetPaths[$key]);
                    bcompiler_write_footer($fh);
                    fclose($fh);
                    //刪除未加密的原始檔

                    unlink($this->targetPaths[$key]);
                    //重新命名加密過後的檔案

                    rename($this->targetPaths[$key].'encrypt.php',$this->targetPaths[$key]);
                    echo '完畢'.$this->newline;
                }
                echo $this->newline.$this->newline;
            }
        }
        //重新計算壓縮加密後的資料夾大小
        $this->sizeAfterZip = $this->getSizeUnit($this->getDirSize($this->targetDir),2);
        echo '【結束加密程序】'.$this->newline.$this->newline;

        echo '《報告資訊》'.$this->newline;
        echo '來源資料夾:'.$this->sourceDir.'('.$this->sizeBeforeZip.')'.$this->newline;
        echo '目的資料夾:'.$this->targetDir.'('.$this->sizeAfterZip.')'.$this->newline;
        echo '檔案大小增幅:+'.$this->getSizeUnit(($this->getDirSize($this->targetDir) - $this->getDirSize($this->sourceDir))).$this->newline;
        echo '檔案總數:'.count($this->sourcefilePaths).'個'.$this->newline;

    }
/**
 *  刪除目錄夾所有檔案
 *
 * @param string $dir 欲刪除的資料夾
 * @param boolean $deleteSelf 同時刪除資料夾
 * @return void
 */
    private function cleanDir($dir='.',$deleteSelf=true){
        if(!$dh = @opendir($dir)) return;
        while (($obj = readdir($dh))) {
            if($obj=='.' || $obj=='..') continue;
            if (!@unlink($dir.'/'.$obj)) $this->cleanDir($dir.'/'.$obj, true);
        }
        if ($deleteSelf){
            closedir($dh);
            @rmdir($dir);
        }
    }
/**
 *  取得資料夾的總檔案大小
 *
 * @param string $dir 欲剖析的資料夾
 * @return int 位元組
 */
    private function getDirSize($dir='.'){
        //取得檔案路徑清單
        $filePaths = $this->getPaths($dir,'*');
        //初始化計數器
        $sizeCounter = 0;
        foreach($filePaths as $key => $path){
            $sizeCounter = $sizeCounter + filesize($path);
        }
        return ($sizeCounter);
    }
/**
 *  取得資料夾所有配對的路徑
 *
 * @param string $start_dir 欲剖析的資料夾
 * @return array 檔案路徑陣列
 */
    private function getPaths($sDir, $sPattern, $nFlags = NULL){
        $sDir = escapeshellcmd($sDir);
        $aFiles = glob("$sDir/$sPattern", $nFlags);
        foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir)  {
            $aSubFiles = $this->getPaths($sSubDir, $sPattern, $nFlags);
            $aFiles = array_merge($aFiles, $aSubFiles);
        }
        return $aFiles;
    }
/**
 *  檔案大小單位轉換函式
 *
 * @param int 檔案大小
 * @param int 小數點位數
 * @param boolean 是否要將資料切成陣列
 * @return mix 字串或陣列
 */
    public function getSizeUnit($size,$decimal=2,$split=false){
        //設定單位序列
        $unit = array('Bytes','KB','MB','GB','TB','PB','EB','ZB','YB');
        //初始化索引
        $flag = 0;
        //進行簡化除算
        while($size >= 1024){
            $size = $size / 1024;
            $flag++;
        }
        //是否要將數值與單位分開
        if($split){
            $sizeUnit = array(
                'size' => number_format($size,$decimal),
                'unit' => $unit[$flag]
            );
        } else {
            $sizeUnit = (number_format($size,$decimal)).$unit[$flag];
        }
        //回傳大小與單位
        return ($sizeUnit);
    }
}
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 低溫烘培 的頭像
    低溫烘培

    ::SANKAI::

    低溫烘培 發表在 痞客邦 留言(1) 人氣()