- 浏览: 140201 次
- 性别:
- 来自: 北京
文章分类
最新评论
<?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(); //加密
发表评论
-
vld 安装 使用
2012-03-19 13:25 2018安装 1、 wget http://pecl.php.net/ ... -
编译php 错误
2012-03-19 09:53 728make: *** [ext/fileinfo/libmagi ... -
phpunit安装问题
2011-08-05 14:06 1227今天试了一下安装phpunit 结果发现问题不少,我得方法是用 ... -
yii 目录结构{转}
2011-07-07 15:57 841本帖最后由 浩劫 于 20 ... -
soap
2011-07-06 10:56 1097在windows下的php.ini文件里 找到这一行代码(如 ... -
yii 目录结构
2011-07-05 08:16 2396testdrive/ index.php ...
相关推荐
exe程序加密器修改D
加密狗型号检测工具修改自用版,用于检测插在电脑上的加密狗的型号,支持目前所有主流加密狗!
Herom2内置加密脚本解密工具修改版 解密HEROM2引擎的加密脚本
<br>举例说明:例如,本加密工具安装在c:\hideasoft\java_protect,执行加密后的CLASS文件的命令行如下: java -agentlib:c:\hideasoft\java_protect\hidea <您的CLASS类及参数> 应用场合 独立的应用...
基于sqlite3的加密版本的数据库动态链接库,附lib和.h头文件,新测试可用。可设置密码和修改密码,加密后的数据库文件是无法被打开的。官方提供的免费版本sqlite3都是没有加密的,官方收费的很贵哦,有需要的朋友...
内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...
最近,我忙里偷闲地将原先的AES 4.2 版 加密与解密软件作了一次较大的改动。并将其发布在此与大家分享。 在AES 5.0 版 加密与解密软件中在原先AES 4.2 版 加密与解密软件的基础上作出了以下改进: 1、修改了几...
agentlib:c:\windows\JLoader %JAVA_OPTS%,保存setenv.bat文件,重新启动Tomcat后就可以正确加载加密类了。 2.独立的Java应用程序 在您的应用程序运行参数中加入以下内容: -agentlib:的存放目录>\JLoader ...
java -agentlib:c:\lanswonsoft\java_protect\lanswon <您的CLASS类及参数> 应用场合 独立的应用程序(Application,自定义main方法),运行java时,带上参数-agentlib:<所在路径>\lanswon Tomcat等JAVA Web ...
飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版飞天加密锁编辑器中文版
wdb php水晶修改加密版.zip
phpspy2013个人修改版,加密过免杀 非官方发布,增加一些功能,Filemanage增加非FSO模式,增加文件打包 登陆页面伪造、代码压缩加密 登陆页面shell.php?doing=login,密码:admin
v1.8.9(内测版) 新增API接口开通新增设置开通api接口价格新增qq互联登录新增sg11支持批量加密修复注册验证失败BUG修复加密乱码报错BUG优化xend加密优化api接口提交优化sg11加密 V1.8 1.更新资源网系统 2.更新ENPHP...
v0230版本延续了新青年http://xqnbbs.126.com的的界面,增加了《WDB冰雨盟不完全修改版》http://www.qq100.net 的几个功能。 新增加主要功能: 1 增加了用户数据加密功能(感谢copland大力支持) ...
如果不设置用户密码,用户将可以直接查看加密的文件夹,但禁止复制、删除和拷贝。...支持移动硬盘:可以直接加密移动硬盘上的数据,用户可以浏览里面的文件,但无法修改,复制,删除。 适用于文档演示,资料出售等情况
PYTHON Crypto库支持RSA,私钥加密公钥解密, 文件名:RSA.PY 路径:Crypto\PublicKey\RSA.py 将此Crypto库中以上文件替换。 关于加解密方法看我的文章有写
内容概要:nacos2.0.4版本使用RSA算法加密之后的源码,可以直接使用。下载nacos源码之后进行代码编写,修改了前端用户名和密码加密传输,后端使用RSA算法将收到的信息进行解码判断。内容包含源代码、打包之后的zip...
此Proxool修改包已经加入加密解密功能,直接加入压缩包中的jar再将DecUtil类放于项目,此类中有main方法生成加密和解密文。本人已经自用项目一切OK,希望你也行,因为很费时间费力顾10分对不起了,不会用的可以评论...
3、反CRC:当被加密的程序有自我检验,加密运行时会将报文件被修改的错误,这时可以选中这项,如果程序是PB,VFP,易语言编写的,请选中这项 4、是否压缩:对被加密的文件进行压缩,如果选中了虚拟机或要加密的文件...
v1.8.9(内测版) 新增API接口开通新增设置开通api接口价格新增qq互联登录新增sg11支持批量加密修复注册验证失败BUG修复加密乱码报错BUG优化xend加密优化api接口提交优化sg11加密 安装教程: 环境:PHP版本必须7.X...