`
fantom
  • 浏览: 140201 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

修改版加密类

    博客分类:
  • php
阅读更多
<?php



/**
 * Description of Imgauthcode
 *
 * @author fantom
 * @time 2012-4-23
 */
final  class authcode {
        private static $_instance;
        private $_ckey_length = 12;  //随机密钥长度
        private $_keya; //密匙a会参与加解密 
        private $_keyb; //用来做数据完整性验证
        private $_keyc; //_密匙c用于变化生成的密文   (初始化向量IV)
        private $_cryptkey; //运算的密匙
        private $_result; //与预处理串
        
        private $_str; //明文或密文
        private $_key; //密钥
        // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙  (初始化向量IV)    
        // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。(实际上就是iv)
        // 取值越大,密文变动规律越大,密文变化 = 16 的 $this->_ckey_length 次方   
        // 当此值为 0 时,则不产生随机密钥   
        private  $_expiry; //密文有效期

        /**
         * 私有构造函数
         * @param author fantom
         * @param time 2012-04-23
         */

        private function __construct() {
                
        }

        /**
         * 私有克隆函数
         * @param author fantom
         * @param time 2012-04-23
         */
        private function __clone() {
                
        }

        /**
         * 单件入口
         * @param author fantom
         * @param time 2012-04-23
         */
        static public function getInstance() {

                if (isset(self::$_instance) || is_null(self::$_instance)) {
                        self::$_instance = new authcode();
                }
                return self::$_instance;
        }

        /**
         * //__set()方法用来设置私有属性
         * @param author fantom
         * @param time 2012-04-23
         */
        public function __set($privateName, $value) {
                $this->$privateName = $value;
        }

        /**
         * //__get()方法用来获取私有属性
         * @param author fantom
         * @param time 2012-04-23
         */
        public function __get($privateName) {
                if (isset($this->$privateName)) {
                        return($this->$privateName);
                } else {
                        return null;
                }
        }

    
        
        /**
         * 加密|解密分支第一部分 
         * @param author fantom
         * @param time 2012-04-23
         */
        private function cryptstart() {
                // 密匙    
                $key = md5($this->_key);
                // 密匙a会参与加解密    
                $this->_keya = md5(substr($key, 0, 16));
                // 密匙b会用来做数据完整性验证    
                $this->_keyb = md5(substr($key, 16, 16));
                // 密匙c用于变化生成的密文   (初始化向量IV)
                return $this;
        }

        /**
         * 加密|解密分支第二部分 
         * @param author fantom
         * @param time 2012-04-23
         */
        private function cryptAfter() {
                // 参与运算的密匙
                $this->_cryptkey = $this->_keya . md5($this->_keya . $this->_keyc);
                $key_length = strlen($this->_cryptkey);
                $string_length = strlen($this->_str);

                $boxArr = range(0, 255);

                $rndkeyArr = array();
                // 产生密匙簿    
                for ($i = 0; $i <= 255; $i++) {
                        $rndkeyArr[$i] = ord($this->_cryptkey[$i % $key_length]);
                }
                // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度    
                for ($j = $i = 0; $i < 256; $i++) {
                        $j = ($j + $boxArr[$i] + $rndkeyArr[$i]) % 256;
                        $tmp = $boxArr[$i];
                        $boxArr[$i] = $boxArr[$j];
                        $boxArr[$j] = $tmp;
                }
                // 核心加解密部分   
                for ($a = $j = $i = 0; $i < $string_length; $i++) {
                        $a = ($a + 1) % 256;
                        $j = ($j + $boxArr[$a]) % 256;
                        $tmp = $boxArr[$a];
                        $boxArr[$a] = $boxArr[$j];
                        $boxArr[$j] = $tmp;
                        // 从密匙簿得出密匙进行异或,再转成字符   
                        $this->_result .= chr(ord($this->_str[$i]) ^ ($boxArr[($boxArr[$a] + $boxArr[$j]) % 256]));
                }
                return $this;
        }

        /**
         * // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性     
         * @param author fantom
         * @param time 2012-04-23
         */
        private function encryptCode() {
                // 密匙c用于变化生成的密文
                $this->_keyc = $this->_ckey_length ? substr(md5(microtime()), -$this->_ckey_length) : '';
                $this->_str = sprintf('%010d', $this->_expiry ? $this->_expiry + time() : 0) . substr(md5($this->_str . $this->_keyb), 0, 16) . $this->_str; 
                return $this;
        }

        /**
         * 加密后返回串
         * @param author fantom
         * @param time 2012-04-23
         */
        private function encryptResult() {
                return $this->_keyc . str_replace('=', '', base64_encode($this->_result));
        }

        /**
         * 解码,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确    
         * @param author fantom
         * @param time 2012-04-23
         */
        private function decryptCode() {
                $this->_keyc = $this->_ckey_length ? substr($this->_str, 0, $this->_ckey_length) : '';
                $this->_str = base64_decode(substr($this->_str, $this->_ckey_length));
                return $this;
        }

        /**
         * 解密后返回明文
         * @param author fantom
         * @param time 2012-04-23
         */
        private function decryptResult() {
                if ((substr($this->_result, 0, 10) == 0 || substr($this->_result, 0, 10) - time() > 0) && substr($this->_result, 10, 16) == substr(md5(substr($this->_result, 26) . $this->_keyb), 0, 16)) {
                        return substr($this->_result, 26);
                } else {
                        return null;
                }
        }

        /**
         * 检测属性是否有值
         * @param author fantom
         * @param time 2012-04-23
         */
        private function checkAttribute() {
                $privateArr = $this->privateArr();
                foreach ($privateArr as $key => $value) {
                        if ($value == false) {
                                continue;
                        }
                        if (!$this->$key) {
                                include_once(ROOT_PATH . 'lib/log.class.php'); //加密解密
                                log::write(__FILE__ . ' ::' . __LINE__ . "行 {$key}属性没有设置值");
                                exit;
                        }
                }
                return $this;
        }

        /**
         * 需要设置属性的名称
         * @param author fantom
         * @param time 2012-04-23
         */
        private function privateArr() {
                return array(
                    '_str' => true, //true为必需属性,false为必需属性
                    '_key' => true,
                    '_expiry' => false,
                );
        }

        /**
         * 设置必需属性
         * @param author fantom
         * @param time 2012-04-23
         */
        public function setprivateArr($arr) {
                foreach ($arr as $key => $value) {
                        if (property_exists($this, $key)) {
                                $this->$key = $value;
                        }
                }
                return $this;
        }

        /**
         * 执行加密入口
         * @param author fantom
         * @param time 2012-04-23
         */
        public function doencryptcode() {
                return $this->checkAttribute()->cryptstart()->encryptCode()->cryptAfter()->encryptResult();
        }

        /**
         * 执行解密入口
         * @param author fantom
         * @param time 2012-04-23
         */
        public function dodecryptcode() {
                return $this->checkAttribute()->cryptstart()->decryptCode()->cryptAfter()->decryptResult();
        }

}


使用方法-:
$arr = array('_str'=>_MAJORPRODUCTID,'_key'=>_AUTHKEY,'_expiry'=>100); 
$strcode=authcode::getInstance()->setprivateArr($arr)->doencryptcode();加密

$arr = array('_str'=>_MAJORPRODUCTID,'_key'=>_AUTHKEY);	
$strcode=authcode::getInstance()->setprivateArr($arr)->dodecryptcode();解密

使用方法二:
$arr = array('_str'=>_MAJORPRODUCTID,'_key'=>_AUTHKEY,'_expiry'=>100);
$strcodes = authcode::getInstance();
$strcodes->_str = _PRODUCTID;
$strcodes->_key = _AUTHKEY;
$strcodes->_expiry = 100;
$strcode = $strcodes->doencryptcode(); //加密
分享到:
评论

相关推荐

    exe程序加密器修改版

    exe程序加密器修改D

    加密狗型号检测工具修改版

    加密狗型号检测工具修改自用版,用于检测插在电脑上的加密狗的型号,支持目前所有主流加密狗!

    Herom2内置加密脚本解密工具修改版

    Herom2内置加密脚本解密工具修改版 解密HEROM2引擎的加密脚本

    Java类加密程序

    &lt;br&gt;举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下: java -agentlib:c:\hideasoft\java_protect\hidea &lt;您的CLASS类及参数&gt; 应用场合 独立的应用...

    sqlite3加密版本数据库

    基于sqlite3的加密版本的数据库动态链接库,附lib和.h头文件,新测试可用。可设置密码和修改密码,加密后的数据库文件是无法被打开的。官方提供的免费版本sqlite3都是没有加密的,官方收费的很贵哦,有需要的朋友...

    nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。

    内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...

    AES 5.0 版 加密与解密软件 终极版(以后不会再有太大的升级)_各个版本中速度、性能与界面最好

    最近,我忙里偷闲地将原先的AES 4.2 版 加密与解密软件作了一次较大的改动。并将其发布在此与大家分享。 在AES 5.0 版 加密与解密软件中在原先AES 4.2 版 加密与解密软件的基础上作出了以下改进: 1、修改了几...

    Java类文件加密专家

    agentlib:c:\windows\JLoader %JAVA_OPTS%,保存setenv.bat文件,重新启动Tomcat后就可以正确加载加密类了。 2.独立的Java应用程序 在您的应用程序运行参数中加入以下内容: -agentlib:的存放目录&gt;\JLoader ...

    Java类加密2.0版本,无限制

    java -agentlib:c:\lanswonsoft\java_protect\lanswon &lt;您的CLASS类及参数&gt; 应用场合 独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:&lt;所在路径&gt;\lanswon Tomcat等JAVA Web ...

    飞天加密锁编辑器中文版飞天加密锁编辑器中文版

    飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版

    wdb php水晶修改加密版.zip

    wdb php水晶修改加密版.zip

    phpspy2013个人修改版,加密过免杀

    phpspy2013个人修改版,加密过免杀 非官方发布,增加一些功能,Filemanage增加非FSO模式,增加文件打包 登陆页面伪造、代码压缩加密 登陆页面shell.php?doing=login,密码:admin

    企业级程序苏林加密系统 php加密的程序源码 sg11加密 xend加密 goto加密等

    v1.8.9(内测版) 新增API接口开通新增设置开通api接口价格新增qq互联登录新增sg11支持批量加密修复注册验证失败BUG修复加密乱码报错BUG优化xend加密优化api接口提交优化sg11加密 V1.8 1.更新资源网系统 2.更新ENPHP...

    wdb php水晶修改加密版

    v0230版本延续了新青年http://xqnbbs.126.com的的界面,增加了《WDB冰雨盟不完全修改版》http://www.qq100.net 的几个功能。 新增加主要功能: 1 增加了用户数据加密功能(感谢copland大力支持) ...

    共享文件夹加密专家 v4.5.0 破解版

    如果不设置用户密码,用户将可以直接查看加密的文件夹,但禁止复制、删除和拷贝。...支持移动硬盘:可以直接加密移动硬盘上的数据,用户可以浏览里面的文件,但无法修改,复制,删除。 适用于文档演示,资料出售等情况

    PYTHON Crypto库支持RSA,私钥加密公钥解密(修改版)

    PYTHON Crypto库支持RSA,私钥加密公钥解密, 文件名:RSA.PY 路径:Crypto\PublicKey\RSA.py 将此Crypto库中以上文件替换。 关于加解密方法看我的文章有写

    nacos2.0.4版本使用RSA算法加密之后的源码,可以直接使用。

    内容概要:nacos2.0.4版本使用RSA算法加密之后的源码,可以直接使用。下载nacos源码之后进行代码编写,修改了前端用户名和密码加密传输,后端使用RSA算法将收到的信息进行解码判断。内容包含源代码、打包之后的zip...

    Proxool加密解密完成版

    此Proxool修改包已经加入加密解密功能,直接加入压缩包中的jar再将DecUtil类放于项目,此类中有main方法生成加密和解密文。本人已经自用项目一切OK,希望你也行,因为很费时间费力顾10分对不起了,不会用的可以评论...

    硬件加密狗空狗,软件外壳加密程序

    3、反CRC:当被加密的程序有自我检验,加密运行时会将报文件被修改的错误,这时可以选中这项,如果程序是PB,VFP,易语言编写的,请选中这项 4、是否压缩:对被加密的文件进行压缩,如果选中了虚拟机或要加密的文件...

    苏林加密系统_php加密程序源码_企业级程序.zip

    v1.8.9(内测版) 新增API接口开通新增设置开通api接口价格新增qq互联登录新增sg11支持批量加密修复注册验证失败BUG修复加密乱码报错BUG优化xend加密优化api接口提交优化sg11加密 安装教程: 环境:PHP版本必须7.X...

Global site tag (gtag.js) - Google Analytics