discuz 经典php加密解密函数 authcode 解析
来源:asp之家 发布时间:2010-04-22 16:49:00
康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
原理如下,假如:
加密
明文:1010 1001
密匙:1110 0011
密文:0100 1010
得出密文0100 1010,解密之需和密匙异或下就可以了
解密
密文:0100 1010
密匙:1110 0011
明文:1010 1001
并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。
那我们一起看下康盛的authcode怎么做的吧
1. // 参数解释
2. // $string: 明文 或 密文
3. // $operation:DECODE表示解密,其它表示加密
4. // $key: 密匙
5. // $expiry:密文有效期
6. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
7. // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
8. $ckey_length = 4;
9.
10. // 密匙
11. $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
12.
13. // 密匙a会参与加解密
14. $keya = md5(substr($key, 0, 16));
15. // 密匙b会用来做数据完整性验证
16. $keyb = md5(substr($key, 16, 16));
17. // 密匙c用于变化生成的密文
18. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : '';
19. // 参与运算的密匙
20. $cryptkey = $keya.md5($keya.$keyc);
21. $key_length = strlen($cryptkey);
22. // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性
23. // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
24. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
25. $string_length = strlen($string);
26. $result = '';
27. $box = range(0, 255);
28. $rndkey = array();
29. // 产生密匙簿
30. for($i = 0; $i <= 255; $i++) {
31. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
32. }
33. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
34. for($j = $i = 0; $i < 256; $i++) {
35. $j = ($j + $box[$i] + $rndkey[$i]) % 256;
36. $tmp = $box[$i];
37. $box[$i] = $box[$j];
38. $box[$j] = $tmp;
39. }
40. // 核心加解密部分
41. for($a = $j = $i = 0; $i < $string_length; $i++) {
42. $a = ($a + 1) % 256;
43. $j = ($j + $box[$a]) % 256;
44. $tmp = $box[$a];
45. $box[$a] = $box[$j];
46. $box[$j] = $tmp;
47. // 从密匙簿得出密匙进行异或,再转成字符
48. $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
49. }
50. if($operation == 'DECODE') {
51. // substr($result, 0, 10) == 0 验证数据有效性
52. // substr($result, 0, 10) - time() > 0 验证数据有效性
53. // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
54. // 验证数据有效性,请看未加密明文的格式
55. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
56. return substr($result, 26);
57. } else {
58. return '';
59. }
60. } else {
61. // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
62. // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
63. return $keyc.str_replace('=', '', base64_encode($result));
64. }
65. }
但是有点遗憾,这个函数所有权属于康盛创想,并不能自由使用的
猜你喜欢
- 问题描述安装Qt5.15.0后,在运行测试用例时弹出错误:qt.qpa.plugin: Could not load the Qt plat
- WordPress 即将更新到 3.2,和 3.1 的理念一样,WordPress 3.2 将继续在用户体验上下功夫。WordPress 3
- 在编程学习中,很多时候,我们希望将数据库和软件的运行进行分离,比如软件通过ip地址连接到数据库进行存储操作,但由于学习成本有限,我们通常的办
- IXWebHosting是一家获得好评的虚拟主机供应商,提供Linux和Windows两种方案,因此,您更容易能够到合适的主机方案。所有的X
- 首先查看apache是否加载了mod_deflate.so模块,如果没有需要安装加载。找到并下载和当前apache版本相同的源码文件,解压缩
- WordPress系统的用户密码是保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password
- 在使用GoDaddy主机时,常会出现一些问题,下面把一些常见的问题给大家参考:Perl语言能否使用FastCGI?可以。但是,你需要在含有.
- 完美站长站立足于草根站长和个人企业,很多人问我们一些常见的CMS的优劣区别,今天抽个时间写一下供大家参考自己做站长很多年了,对国内的CMS也
- 11月6日消息,据中国法院网报道,由于盗播热映电影,爆米花视频网的主办公司普信通(北京)科技有限公经法院主持调解同意赔偿还款,但还款事宜此后
- 在linux上以服务的方式启动java程序1.安装jsvc在tomcat的bin目录下有一个jsvc.tar.gz的文件,进入tomcat的
- 无论是在校生,上班族,还是网吧用户,一定都遇到过令人怒不可遏的ARP攻击,ARP攻击会恶意阻断你的计算机与别的计算机之间的网络通信,导致网络
- 10月16日消息,对于大多数企业来说,升级到微软公司即将推出的操作系统Windows 7是不可避免的趋势。全球技术研究和咨询公司Gartne
- 在用TCP/IP协议族架设的网络中,每一个节点都有一个唯一的IP地址,用来作为它们唯一的标志。然而,如果让使用者来记住这些毫无记忆规律的IP
- 上次,就遇到“HTTP 错误 500.100 - 内部服务器错误 - ASP 错误”,现在把所有Http状态代码含义表与部分解决方法贴出来。
- 1.UPS(不间断电源)的使用问题某商店正在压榨它的网络系统的最后生命。尽管那台很老的服务器几乎难以满足商店运营的需要,但经营者甚至连更换U
- 之前我通过百度经验上的过程来安装Ubuntu16,但是每次安装的时候没有什么问题,就是安装好了Tools,也设置好了共享文件夹,但是在路径:
- Linux的screen命令不错,习惯了你会觉得它比windows的任务栏好用多了。下面是我的.screenrc,仅供参考Linux的scr
- 我是名站长,就像08上海草根大会上哪位嘉宾(忘了)一直强调自己是一名草根一样,我是名真正的站长,因为我有自己的站,并且很多人,可是我现在关注
- 在传统的金秋10月,也都是各大厂商推陈出新的时刻,作为民族软件旗帜的金山软件,旗下应用软件及游戏业务都将有诸多产品问世,其中《飞天风云》、《
- 在上一篇的确保Linux VPS及服务器更加安全之Xshell设置密钥登录文章中已经分享到XSHELL使用密钥登陆我们的VPS服务器确保机器