怎样给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 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
php 生成WML页面方法详解
Aug 09 PHP
php设计模式 Factory(工厂模式)
Jun 26 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
PHP生成自定义长度随机字符串的函数分享
May 04 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
PHP回调函数简单用法示例
May 08 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 PHP
PHP实现简单的计算器
Aug 28 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
PHP 应用程序的安全 -- 不能违反的四条安全规则
2006/11/26 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
限制上传文件大小和格式的jQuery插件实例
2015/01/24 Javascript
JavaScript中的setMilliseconds()方法使用详解
2015/06/11 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
JS实现根据详细地址获取经纬度功能示例
2019/04/16 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
[03:56]显微镜下的DOTA2第十一期——鬼畜的死亡先知播音员
2014/06/23 DOTA
[09:40]DAC2018 4.5 SOLO赛 MidOne vs Miracle
2018/04/06 DOTA
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
使用python实现链表操作
2018/01/26 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
详解Python 函数参数的拆解
2020/09/02 Python
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
JAVA中运算符的分类及举例
2015/09/12 面试题
中级会计职业生涯规划书
2014/03/01 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
少年犯观后感
2015/06/11 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书