PHP 之源代码加密与解密,加密后可直接运行

方式一:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677<?php/*** Created by PhpStorm.* User: Yang* Date: 2019/10/16* Time: 10:25*/  class Encipher { private $_sourceFile '';private $_encodedFile '';private $_comments array('Author: Yang','Email: 1017836267@qq.com'); public function __construct($sourceFile$encodeFile$comments array()){!empty($sourceFile) && $this->_sourceFile = $sourceFile;!empty($encodeFile) && $this->_encodedFile = $encodeFile;!empty($comments) && $this->comments = (array)$comments; if (empty($this->_sourceFile) || !file_exists($this->_sourceFile)) {exit("Source file does not exist.");}if (empty($this->_encodedFile) || !file_exists($this->_encodedFile)) {//如果源文件不存在,则创建fopen($this->_encodedFile, "w");}} /*** 返回随机字符串* @return string*/private function createRandKey()// 返回随机字符串$str "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";return str_shuffle($str);} /*** 加密函数* @return bool*/public function encode() {//随机密匙1$k1 $this->createRandKey();//随机密匙2$k2 $this->createRandKey();// 获取源文件内容$sourceContent file_get_contents($this->_sourceFile);//base64加密$base64 $headers) . "\r\n" $prefixCode), $enkey$dekey);$evalEmbedCode $this->_getEvalEmbedCode($decodeCodeOfHostedCode$regVars$enkey$dekey);/*** eval(base64_decode(*     str_replace("\$hookKey", '', strtr($hookKey.$evalEmbedCode, $dekey, $enkey))* ));* $unset;*/$unset 'unset(' $funcStrVar;foreach ($regVars as $var) {$unset .= ',' $var;}$unset .= ');';$evalCode "@eval(" $regVars["base64_decode"] . "(" $regVars["str_replace"] . "(" $regVars["\$hookKey"] . ",''," $regVars["strtr"] . "('" $hookKey $evalEmbedCode "','" $dekey "','" $enkey "'))));" $unset;$originalEncodedCode $this->_getPHPEncode($file$enkey$dekey);$enCode = implode("\r\n"$headers) . "\r\n" $prefixCode $evalCode "return;?>\r\n" $originalEncodedCode;$this->_saveEncryptFile($file$enCode$enkey$dekey);} /*** The encoded code needs extra code*/private function _getBaseCodeOfHostedCode(){$code = <<<EOT\$farrs   = file(str_replace('\\\\''/'__FILE__));\$enCode  array_pop(\$farrs);\$phpCode array_pop(\$farrs);\$fstrs   = implode('', \$farrs) . substr(\$phpCode, 0, strrpos(\$phpCode'@ev'));\$hookKey = md5(\$fstrs);\$farrs   = \$phpCode = \$fstrs = NULL;EOT;return $code;} /*** The encoded code needs decode code* if the licence is generated, also need to process it.*/private function _getDecodeCodeOfHostedCode($file$enkey$dekey){$code = <<<EOTeval(base64_decode(strtr(\$enCode'{$dekey}''{$enkey}')));\$enCode = NULL;EOT;return $code;} private function _getFuncVarDefCode($usedFuncMaps$funcChars$funcStrVar){//all the chars of function name$funcStr = implode(""$funcChars); //set variable name's value for each variable of function name$funcVarValArr $this->_getFuncVarvalArr($usedFuncMaps$funcChars$funcStrVar); //encoded code define function name string.$code $funcStrVar "='{$funcStr}';";foreach ($usedFuncMaps as $func => $val) {$code .= $val "= " $funcVarValArr[$func] . ";\n";}return $code;} private function _getEvalEmbedCode($decodeCodeOfHostedCode$regVars$enkey$dekey){$code = preg_replace("/\r|\n/is"""strtr($decodeCodeOfHostedCode$regVars));//replace multi space to one, and encode it via base64$code base64_encode(preg_replace("/\s{2,}/is"" "$code));$code strtr($code$enkey$dekey);return $code;} /*** get function names and chars for all functions*/private function _getMatchedFunctions($code){//match all function namepreg_match_all("/([a-z_0-9]+)\(/is"$code$matches);$usedFuncs array_unique($matches[1]);if (false !== ($key array_search('eval'$usedFuncs))) {unset($usedFuncs[$key]);} $funcChars array_unique(preg_split("//is", implode(""$usedFuncs), -1, PREG_SPLIT_NO_EMPTY));shuffle($funcChars);return array(array_flip($usedFuncs), $funcChars);} /*** get variable names*/private function _getMatchedVariables($code){preg_match_all("/(\\\$[a-z0-9]+)\s*\=/is"$code$matches);return array_flip($matches[1]);} private function _getFuncVarvalArr($usedFuncMaps$funcChars$funcStrVar){$funcVarValArr array();foreach ($usedFuncMaps as $func => $_val) {$val "";for ($i = 0, $len strlen($func); $i $len$i++) {if ($val == "") {$val $funcStrVar "{" array_search($func{$i}, $funcChars) . "}";else {$val $val "." $funcStrVar "{" array_search($func{$i}, $funcChars) . "}";}}$funcVarValArr[$func] = $val;}return $funcVarValArr;} /*** get php pure code, trim php tag*/private function _getPHPCode($file){$from $this->source_file . '/' $file;$str file_get_contents($from);$str = preg_replace("/^[\s\xef\xbb\xbf]*<\?php/is"""$str);$str = trim(preg_replace("/\?>\s*$/is"""$str));return $str;} /*** get php encoded code*/private function _getPHPEncode($file$enkey$dekey){$code $this->_getPHPCode($file);$enCode strtr(base64_encode($code), $enkey$dekey);return $enCode;} private function _getKeyPairs(){$enkey $this->_getKeyStr();$dekey $this->_getKeyStr();while ($enkey === $dekey) {$dekey $this->_getKeyStr();}return array($enkey$dekey);} private function _getKeyStr(){$base64str 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';for ($i = 127; $i <= 160; $i++) {$base64str .= chr($i);}$baseChars array_filter(preg_split("//is"$base64str));$baseChars[] = 0;shuffle($baseChars);return implode(""$baseChars);} private function _setVarName($funcs$filter array()){$length $this->varnameLength;$basestr $this->_getInvisibleStr($length);$count count($funcs);if ($count == 0) {return array();}$varArr array();do {$randStr substr("\$" str_shuffle($basestr), 0, rand(2, $length));if (!in_array($randStr$varArr) && !in_array($randStr$filter)) {$varArr[] = $randStr;$count--;}while ($count > 0);return array_combine(array_keys($funcs), $varArr);} /*** legal variable names: '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'* Invisiable string's ascii is from 127 to 255:'[\x7f-\xff][\x7f-\xff]*'* param $length  the variable name's length.*/private function _getInvisibleStr($length = 10){$str '';for ($i = 0; $i $length$i++) {$num = rand(127, 255);$str .= chr($num);}return $str;} private function _saveEncryptFile($file$enCode$enkey = null, $dekey = null){$to $this->encoded_file . '/' $file;file_put_contents($to$enCode);echo $to "\n";}}