discuz加密解密,可参考下
2019独角兽企业重金招聘Python工程师标准>>>
// 参数解释 // $string: 明文 或 密文 // $operation:DECODE表示解密,其它表示加密 // $key: 密匙 // $expiry:密文有效期 static public function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){ // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 $ckey_length = 4; // 密匙 $key = md5($key ? $key : '123456'); // 密匙a会参与加解密 $keya = md5(substr($key, 0, 16)); // 密匙b会用来做数据完整性验证 $keyb = md5(substr($key, 16, 16)); // 密匙c用于变化生成的密文 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; // 参与运算的密匙 $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); // 产生密匙簿 for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } // 核心加解密部分 for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; // 从密匙簿得出密匙进行异或,再转成字符 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { // substr($result, 0, 10) == 0 验证数据有效性 // substr($result, 0, 10) - time() > 0 验证数据有效性 // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性 // 验证数据有效性,请看未加密明文的格式 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return $keyc.str_replace('=', '', base64_encode($result)); } }
转载于:https://my.oschina.net/sharesuiyue/blog/479985
discuz加密解密,可参考下相关推荐
- 白话 discuz加密解密算法,包你懂
今天和大家分享一下discuz的加密和解密算法 研究了一个星期了, 总结了这个 算法有三个特点 1,动态性,同一字符串每次加密的密文都不一样 2,时间性,可以自己加一个限期参数,以秒为单位 3,统一性 ...
- android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。
Encrypt(加密工具) 字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案. 加密类型 摘要 相关方法 简单加密 换一种编码格式 Base64Util 单向加密 只能加密,不 ...
- 叙述无保密机制的rsa签名过程_安全系列之——RSA的公钥私钥有多少人能分的清楚?RSA的签名验签与加密解密如何使用公私钥?...
在对接很多的互联网公司的开发平台时,这些互联网公司未来自身平台的安全,都会需要调用方签名确认调用方的身份是合法的,同时未来信息网络传输的安全可能还需要加密解密.比如对接支付宝.微信开放平台时,需要配置 ...
- Opencv实现图像的加密解密
1.基础:基于异或操作实现图像加密解密 一般情况下,图像的加密和解密过程是通过按位异或运算实现的.将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程 ...
- Spring Cloud Config 配置的加密解密
配置内容的加密解密 很多场景下很多场景下,对于某些敏感的配置内容,例如数据库账号密码等应当加密存储.Config Server为配置内容的加密与解密提供了支持. 安装JCE Config Server ...
- php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)
php加密解密的使用 一.项目说明 二.项目分析 1.js外部文件 2.HTML容器构建 3.layui前端验证 4.php后端验证 封装函数 密码验证规则 strpos内置函数 三.经典的核心加密函 ...
- MacOS下使用C语言基于openssl库进行RSA加密解密
MacOS下使用C语言基于openssl库进行RSA加密解密 1 安装openssl并生成密钥 首先当然要安装openssl(这里记得看一下安装路径,应该是/usr/local/Cellar/open ...
- 怎么把计算机磁盘解密,Win10系统下怎样对磁盘进行加密、解密?Win10系统加密、解密磁盘图文教程...
一些安装了Windows10系统的用户,为了更好地保护自己的个人隐私,会想要对电脑磁盘进行加密.那么,这该如何操作呢?下面小编就介绍下Windows10系统给磁盘加密.解密的具体方法. 具体方法如下: ...
- python加密解密 sha256_Python下实现的RSA加密/解密及签名/验证功能示例
本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能.分享给大家供大家参考,具体如下: 原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() ...
最新文章
- Python 标准库之 fcntl
- 使用Jmeter至WebService压力测试
- 基于Ajax的Web框架Echo2 2.0发布
- 10.Java设计模式 工厂模式,单例模式
- VC++获取屏幕大小第一篇 像素大小GetSystemMetrics
- 浏览器兼容CSS渐进增强 VS 优雅降级如何选择
- 数据结构与算法--3.字符串的旋转
- matlab完整脚本模板,在PyCharm中给Python脚本设置默认的代码模板和活动模板,文末有一个案例(MATLAB GUI和Qt对比做一个界面)...
- android 页面icon拉伸_所有同学!注意咯!!设计师不可忽略的页面转场来咯!!...
- 在scrapy上使用cookie模拟登录
- [哀悼]5.12地震后把网站改成灰色的方法
- 快速幂算法c语言求a的n次方,快速幂运算模板(求n^k以及前几位或后几位)
- 【每日算法Day 64】LeetCode 861. 翻转矩阵后的得分
- [CTSC 1999]拯救大兵瑞恩[网络流24题]孤岛营救问题
- STM32控制WS2812B HAL库
- 范德蒙行列式、克拉默法则、雅可比矩阵
- 微信小游戏代码包侵权的一种解决方案
- Xcode13.3 13.2以及Flutter新版本的稳定性问题
- 项目中报错找不到.h或者.m文件解决方法
- 通俗易懂介绍一下ZigBee的特性
热门文章
- Windows下redis使用及安装
- PHP判断文件夹是否存在和创建文件夹的方法
- Java-WAS的Hello world
- 诗与远方:无题(三十三)
- 前端在线学习网站W3School
- Dockerfile文件详解
- 微型计算机的普通显示器通常有两组引线 即,微型计算机的显示屏通常具有两组引线,即()...
- 超详细:Springboot连接centos7下redis6的必要配置和失败分析
- AOP Error creating bean with name ‘myCaculator‘ defined in file [XXX]
- 聚合中返回source_大数据搜索与可视化分析(9)elasticsearch聚合分析Metric Aggregation...