怎样给PHP源代码加密?PHP二进制加密与解密的解决办法


Posted in PHP onApril 22, 2013

分享2种PHP的源码加密方式,此加密方法支持任意PHP版。

注意,加密后的PHP代码无需第三方工具解密,像往常一样,直接运行即可。

<?php  
 function encode_file_contents($filename) {  
     $type=strtolower(substr(strrchr($filename,'.'),1));  
     if ('php' == $type && is_file($filename) && is_writable($filename)) { // 如果是PHP文件 并且可写 则进行压缩编码  
         $contents = file_get_contents($filename); // 判断文件是否已经被编码处理  
         $contents = php_strip_whitespace($filename);            // 去除PHP头部和尾部标识  
         $headerPos = strpos($contents,'<?php');  
         $footerPos = strrpos($contents,'?>');  
         $contents = substr($contents, $headerPos + 5, $footerPos - $headerPos);  
         $encode = base64_encode(gzdeflate($contents)); // 开始编码  
         $encode = '<?php'."\n eval(gzinflate(base64_decode("."'".$encode."'".")));\n\n?>";   
         return file_put_contents($filename, $encode);  
     }  
     return false;  
 }   
 //调用函数  
 $filename = 'dam.php';  
 encode_file_contents($filename);  
 echo "OK,加密完成!" 
 ?>

加密方式2:
<?php   function RandAbc($length = "") { // 返回随机字符串  
     $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";  
     return str_shuffle($str);  
 }   
 $filename = 'index.php'; //要加密的文件  
 $T_k1 = RandAbc(); //随机密匙1  
 $T_k2 = RandAbc(); //随机密匙2  
 $vstr = file_get_contents($filename);  
 $v1 = base64_encode($vstr);  
 $c = strtr($v1, $T_k1, $T_k2); //根据密匙替换对应字符。  
 $c = $T_k1.$T_k2.$c;  
 $q1 = "O00O0O";  
 $q2 = "O0O000";  
 $q3 = "O0OO00";  
 $q4 = "OO0O00";  
 $q5 = "OO0000";  
 $q6 = "O00OO0";  
 $s = '$'.$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");$'.$q1.'=$'.$q6.'{3}.$'.$q6.'{6}.$'.$q6.'{33}.$'.$q6.'{30};$'.$q3.'=$'.$q6.'{33}.$'.$q6.'{10}.$'.$q6.'{24}.$'.$q6.'{10}.$'.$q6.'{24};$'.$q4.'=$'.$q3.'{0}.$'.$q6.'{18}.$'.$q6.'{3}.$'.$q3.'{0}.$'.$q3.'{1}.$'.$q6.'{24};$'.$q5.'=$'.$q6.'{7}.$'.$q6.'{13};$'.$q1.'.=$'.$q6.'{22}.$'.$q6.'{36}.$'.$q6.'{29}.$'.$q6.'{26}.$'.$q6.'{30}.$'.$q6.'{32}.$'.$q6.'{35}.$'.$q6.'{26}.$'.$q6.'{30};eval($'.$q1.'("'.base64_encode('$'.$q2.'="'.$c.'";eval(\'?>\'.$'.$q1.'($'.$q3.'($'.$q4.'($'.$q2.',$'.$q5.'*2),$'.$q4.'($'.$q2.',$'.$q5.',$'.$q5.'),$'.$q4.'($'.$q2.',0,$'.$q5.'))));').'"));';  
 $s = '<?php '."\n".$s."\n".' ?>';  
 //echo $s;  
 // 生成 加密后的PHP文件  
 $fpp1 = fopen('temp_'.$filename, 'w');  
 fwrite($fpp1, $s) or die('写文件错误');  
 ?>

其实,PHP加密源码方式有很多,譬如,免费的微盾PHP加密,还有 www.phpjm.net 搞的在线加密,只是phpjm更复杂点而已。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另外,分享一个 PHP类,它能对 文本的内容进行 二进制加密 与 解密,代码如下:

<?php   class text_auth  
 {  
     var $n_iter;  
     function text_auth()  
     {  
         $this->setIter(32);  
     }  
     function setIter($n_iter)  
     {  
         $this->n_iter = $n_iter;  
     }  
     function getIter()  
     {  
         return $this->n_iter;  
     }  
     function encrypt($data, $key)  
     {  
         $n = $this->_resize($data, 4);  
         $data_long[0]   = $n;  
         $n_data_long    = $this->_str2long(1, $data, $data_long);  
         $n = count($data_long);  
         if (($n & 1) == 1) {  
             $data_long[$n] = chr(0);  
             $n_data_long++;  
         }  
         $this->_resize($key, 16, true);  
         if ( '' == $key )  
             $key = '0000000000000000';  
         $n_key_long = $this->_str2long(0, $key, $key_long);  
         $enc_data   = '';  
         $w          = array(0, 0);  
         $j          = 0;  
         $k          = array(0, 0, 0, 0);  
         for ($i = 0; $i < $n_data_long; ++$i) {  
             if ($j + 4 <= $n_key_long) {  
                 $k[0] = $key_long[$j];  
                 $k[1] = $key_long[$j + 1];  
                 $k[2] = $key_long[$j + 2];  
                 $k[3] = $key_long[$j + 3];  
             } else {  
                 $k[0] = $key_long[$j % $n_key_long];  
                 $k[1] = $key_long[($j + 1) % $n_key_long];  
                 $k[2] = $key_long[($j + 2) % $n_key_long];  
                 $k[3] = $key_long[($j + 3) % $n_key_long];  
             }  
             $j = ($j + 4) % $n_key_long;  
             $this->_encipherLong($data_long[$i], $data_long[++$i], $w, $k);  
             $enc_data .= $this->_long2str($w[0]);  
             $enc_data .= $this->_long2str($w[1]);  
         }  
         return $enc_data;  
     }  
     function decrypt($enc_data, $key)  
     {  
         $n_enc_data_long = $this->_str2long(0, $enc_data, $enc_data_long);  
         $this->_resize($key, 16, true);  
         if ( '' == $key )  
             $key = '0000000000000000';  
         $n_key_long = $this->_str2long(0, $key, $key_long);  
         $data   = '';  
         $w      = array(0, 0);  
         $j      = 0;  
         $len    = 0;  
         $k      = array(0, 0, 0, 0);  
         $pos    = 0;  
         for ($i = 0; $i < $n_enc_data_long; $i += 2) {  
             if ($j + 4 <= $n_key_long) {  
                 $k[0] = $key_long[$j];  
                 $k[1] = $key_long[$j + 1];  
                 $k[2] = $key_long[$j + 2];  
                 $k[3] = $key_long[$j + 3];  
             } else {  
                 $k[0] = $key_long[$j % $n_key_long];  
                 $k[1] = $key_long[($j + 1) % $n_key_long];  
                 $k[2] = $key_long[($j + 2) % $n_key_long];  
                 $k[3] = $key_long[($j + 3) % $n_key_long];  
             }  
             $j = ($j + 4) % $n_key_long;  
             $this->_decipherLong($enc_data_long[$i], $enc_data_long[$i + 1], $w, $k);  
             if (0 == $i) {  
                 $len = $w[0];  
                 if (4 <= $len) {  
                     $data .= $this->_long2str($w[1]);  
                 } else {  
                     $data .= substr($this->_long2str($w[1]), 0, $len % 4);  
                 }  
             } else {  
                 $pos = ($i - 1) * 4;  
                 if ($pos + 4 <= $len) {  
                     $data .= $this->_long2str($w[0]);  
                     if ($pos + 8 <= $len) {  
                         $data .= $this->_long2str($w[1]);  
                     } elseif ($pos + 4 < $len) {  
                         $data .= substr($this->_long2str($w[1]), 0, $len % 4);  
                     }  
                 } else {  
                     $data .= substr($this->_long2str($w[0]), 0, $len % 4);  
                 }  
             }  
         }  
         return $data;  
     }  
     function _encipherLong($y, $z, &$w, &$k)  
     {  
         $sum    = (integer) 0;  
         $delta  = 0x9E3779B9;  
         $n      = (integer) $this->n_iter;  
         while ($n-- > 0) {  
             $y      = $this->_add($y,  
                                   $this->_add($z << 4 ^ $this->_rshift($z, 5), $z) ^  
                                     $this->_add($sum, $k[$sum & 3]));  
             $sum    = $this->_add($sum, $delta);  
             $z      = $this->_add($z,  
                                   $this->_add($y << 4 ^ $this->_rshift($y, 5), $y) ^  
                                     $this->_add($sum, $k[$this->_rshift($sum, 11) & 3]));  
         }  
         $w[0] = $y;  
         $w[1] = $z;  
     }  
     function _decipherLong($y, $z, &$w, &$k)  
     {  
         $sum    = 0xC6EF3720;  
         $delta  = 0x9E3779B9;  
         $n      = (integer) $this->n_iter;  
         while ($n-- > 0) {  
             $z      = $this->_add($z,  
                                   -($this->_add($y << 4 ^ $this->_rshift($y, 5), $y) ^  
                                         $this->_add($sum, $k[$this->_rshift($sum, 11) & 3])));  
             $sum    = $this->_add($sum, -$delta);  
             $y      = $this->_add($y,  
                                   -($this->_add($z << 4 ^ $this->_rshift($z, 5), $z) ^  
                                         $this->_add($sum, $k[$sum & 3])));  
         }  
         $w[0] = $y;  
         $w[1] = $z;  
     }  
     function _resize(&$data, $size, $nonull = false)  
     {  
         $n      = strlen($data);  
         $nmod   = $n % $size;  
         if ( 0 == $nmod )  
             $nmod = $size;  
         if ($nmod > 0) {  
             if ($nonull) {  
                 for ($i = $n; $i < $n - $nmod + $size; ++$i) {  
                     $data[$i] = $data[$i % $n];  
                 }  
             } else {  
                 for ($i = $n; $i < $n - $nmod + $size; ++$i) {  
                     $data[$i] = chr(0);  
                 }  
             }  
         }  
         return $n;  
     }  
     function _hex2bin($str)  
     {  
         $len = strlen($str);  
         return pack('H' . $len, $str);  
     }  
     function _str2long($start, &$data, &$data_long)  
     {  
         $n = strlen($data);  
         $tmp    = unpack('N*', $data);  
         $j      = $start;  
         foreach ($tmp as $value)  
             $data_long[$j++] = $value;  
         return $j;  
     }  
     function _long2str($l)  
     {  
         return pack('N', $l);  
     }  
     function _rshift($integer, $n)  
     {  
         if (0xffffffff < $integer || -0xffffffff > $integer) {  
             $integer = fmod($integer, 0xffffffff + 1);  
         }  
         if (0x7fffffff < $integer) {  
             $integer -= 0xffffffff + 1.0;  
         } elseif (-0x80000000 > $integer) {  
             $integer += 0xffffffff + 1.0;  
         }  
         if (0 > $integer) {  
             $integer &= 0x7fffffff;  
             $integer >>= $n;  
             $integer |= 1 << (31 - $n);  
         } else {  
             $integer >>= $n;  
         }  
         return $integer;  
     }  
     function _add($i1, $i2)  
     {  
         $result = 0.0;  
         foreach (func_get_args() as $value) {  
             if (0.0 > $value) {  
                 $value -= 1.0 + 0xffffffff;  
             }  
             $result += $value;  
         }  
         if (0xffffffff < $result || -0xffffffff > $result) {  
             $result = fmod($result, 0xffffffff + 1);  
         }  
         if (0x7fffffff < $result) {  
             $result -= 0xffffffff + 1.0;  
         } elseif (-0x80000000 > $result) {  
             $result += 0xffffffff + 1.0;  
         }  
         return $result;  
     }  
 }  
 ?> 
使用方法参考如下:
// 加密过程
view sourceprint?
 $text_file = S_ROOT . './456.php';  
 $str = @file_get_contents($text_file);  
 require_once S_ROOT . "./text_auth.php";  
 $text_auth = new text_auth(64);  
 $str = $text_auth->encrypt($str, "qianyunlai.com");  
 $filename = S_ROOT . './789.php'; // 加密后的文本为二进制,普通的文本编辑器无法正常查看  
 file_put_contents($filename, $str); 
// 解密过程
view sourceprint
?01 $text_file = S_ROOT . './789.php';  
 $str = @file_get_contents($text_file);  
 require_once S_ROOT . "./text_auth.php";  
 $text_auth = new text_auth(64);  
 $str = $text_auth->decrypt($str, "qianyunlai.com");  
 $filename = S_ROOT . './456.php';  
 file_put_contents($filename, $str);

PHP 相关文章推荐
PHP5 安装方法
Oct 09 PHP
php使用session二维数组实例
Nov 06 PHP
php遍历删除整个目录及文件的方法
Mar 13 PHP
php实现的mongodb操作类实例
Apr 03 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
详解Yii2 rules 的验证规则
Dec 02 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
php中pcntl_fork创建子进程的方法实例
Mar 14 PHP
laravel清除视图缓存的代码
Oct 23 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 #PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 #PHP
php多文件上传功能实现原理及代码
Apr 18 #PHP
php实现多张图片上传加水印技巧
Apr 18 #PHP
基于initPHP的框架介绍
Apr 18 #PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 #PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 #PHP
You might like
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
PHP错误提示的关闭方法详解
2013/06/23 PHP
php判断ip黑名单程序代码实例
2014/02/24 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
javascript 写类方式之七
2009/07/05 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JS中如何实现复选框全选功能
2016/12/19 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
Python从列表推导到zip()函数的5种技巧总结
2019/10/23 Python
Python实现把类当做字典来访问
2019/12/16 Python
Python列表切片常用操作实例解析
2020/03/10 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
如何表示python中的相对路径
2020/07/08 Python
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
计算机专业自我鉴定
2013/10/15 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
师德建设实施方案
2014/03/21 职场文书
大学生就业策划书范文
2014/04/04 职场文书
2015年计生工作总结范文
2015/04/24 职场文书
Java基础-封装和继承
2021/07/02 Java/Android
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript