`
fantom
  • 浏览: 141930 次
  • 性别: 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

    加密PDF修改软件

    "加密PDF修改软件"是专门针对这类需求设计的工具,它能够帮助用户解密并修改受保护的PDF文件。这种软件通常具备以下关键功能: 1. **PDF解密**:软件首先需要能够识别和处理各种类型的PDF加密,包括40位和128位RC4...

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

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

    Java类加密程序

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

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

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

    文件夹 加密 软件 绿色版

    除了基本的加密功能,高级的文件夹加密软件还可能包含其他特性,例如隐藏文件夹、自毁机制、防止未经许可的修改或复制、日志记录等。这些增强功能进一步增强了数据的保护。 总的来说,文件夹加密软件绿色版是一种...

    sqlite3加密版本数据库

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

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

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

    wdb php水晶修改加密版.zip

    "wdb php水晶修改加密版.zip"这个压缩包文件名暗示了它包含了一个经过修改和加密的PHP版本,可能是为了保护源代码或者增强系统的安全性。"wdb"可能是一个项目名称、团队代号或者开发者的缩写,而"水晶"可能是这个...

    EXE文件加密9.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 ...

    解决“数据未加密,挂载参数被修改”.zip

    在IT领域,我们经常遇到各种系统和应用的配置问题,其中“数据未加密,挂载参数被修改”是一个常见的安全警告。这个问题涉及到数据保护、存储系统以及系统挂载的正确配置。下面将详细阐述相关知识点。 首先,我们要...

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

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

    EXE文件加密器 增强版 VIP2

    EXE文件加密器是一款专为保护可执行程序(EXE文件)设计的安全工具,主要用于增强文件的安全性,防止未经授权的访问、修改或复制。增强版VIP2是该软件的一个高级版本,提供了更多功能和更强的加密算法,以确保程序...

    目前唯一可修改加密PDF文件的foxit 福昕软件

    目前唯一能修改加密PDF文件的foxit 福昕软件,其他的福昕版本不能修改,只有此版本可以修改加密PDF文件!

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

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

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

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

    广联达加密锁,写锁工具,可以自己升级加密锁。

    1. 防盗版:加密锁的存在使得软件只能在插入了正确加密锁的设备上运行,有效防止了非法复制和分发。 2. 动态授权管理:通过写锁工具,可以实现授权的动态调整,如增加或减少功能,或者根据时间限制使用期限。 3. ...

Global site tag (gtag.js) - Google Analytics