0

0

authcode函数使用异或运算进行加密和解密

php中文网

php中文网

发布时间:2016-06-21 08:56:25

|

1323人浏览过

|

来源于php中文网

原创

康盛的 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 = '';

FashionLabs
FashionLabs

AI服装模特、商品图,可商用,低价提升销量神器

下载

  27. $box = range(0, 255);

  28. $rndkey = array();

  29. // 产生密匙簿

  30. for($i = 0; $i

  31. $rndkey[$i] = ord($cryptkey[$i % $key_length]);

  32. }

  33. // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度

  34. for($j = $i = 0; $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

  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. }

  但是有点遗憾,这个函数所有权属于康盛创想,并不能自由使用的



本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

67

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

32

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

489

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

265

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

18

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

29

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

14

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

69

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

32

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
深入剖析redis教程
深入剖析redis教程

共55课时 | 8.2万人学习

Redis中文开发手册
Redis中文开发手册

共0课时 | 0人学习

麦子学院深入浅出 redis 视频教程
麦子学院深入浅出 redis 视频教程

共20课时 | 4.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号