php加密解密字符串示例


Posted in PHP onOctober 13, 2016

收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

   

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { 

  // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 

  $ckey_length = 4; 

  // 密匙 

  $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);  

  // 密匙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') { 

   // 验证数据有效性,请看未加密明文的格式 

   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)); 

  } 

 }

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
SMARTY学习手记
Jan 04 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
php修改时间格式的代码
May 29 PHP
php中filter_input函数用法分析
Nov 15 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
Dec 25 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
PHP数据库表操作的封装类及用法实例详解
Jul 12 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
PHP APP微信提现接口代码
Sep 30 PHP
PHP加MySQL消息队列深入理解
Feb 27 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 #PHP
php is_writable判断文件是否可写实例代码
Oct 13 #PHP
基于PHP制作验证码
Oct 12 #PHP
实现PHP搜索加分页
Oct 12 #PHP
如何使用PHP给图片加水印
Oct 12 #PHP
php版微信数据统计接口用法示例
Oct 12 #PHP
php版微信js-sdk支付接口类用法示例
Oct 12 #PHP
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
解析php中memcache的应用
2013/06/18 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
2019/10/14 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
vue二级路由设置方法
2018/02/09 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
python如何读写csv数据
2018/03/21 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
python可视化实现KNN算法
2019/10/16 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Python+OpenCV实现旋转文本校正方式
2020/01/09 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
aec加密 php_php aes加密解密类(兼容php5、php7)
2021/03/14 PHP
用Python写一个for循环的例子
2016/07/19 面试题
介绍一下Java的事务处理
2012/12/07 面试题
计算机应用专业学生的自我评价分享
2013/11/03 职场文书
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
面试后感谢信
2014/02/01 职场文书
技术经济专业求职信
2014/09/03 职场文书
新郎答谢词
2015/01/04 职场文书
2015年大学生村官工作总结
2015/04/21 职场文书
医院志愿者活动总结
2015/05/06 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技