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 相关文章推荐
Search Engine Friendly的URL设计
Oct 09 PHP
十天学会php之第四天
Oct 09 PHP
PHP动态变静态原理
Nov 25 PHP
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 PHP
PHP正确解析UTF-8字符串技巧应用
Nov 07 PHP
提高PHP编程效率的方法
Nov 07 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php生成年月日下载列表的方法
Apr 24 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
Laravel 实现添加多语言提示信息
Oct 25 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
php站内搜索关键词变亮的实现方法
2014/12/30 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
firefox插件Firebug的使用教程
2010/01/02 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
JavaScript解析URL参数示例代码
2013/08/12 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
python检测是文件还是目录的方法
2015/07/03 Python
Python 调用Java实例详解
2017/06/02 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
PyTorch上搭建简单神经网络实现回归和分类的示例
2018/04/28 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python学生管理系统开发
2019/01/30 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python GUI编程完整示例
2019/04/04 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
导游词范文
2015/02/13 职场文书
Win11快速关闭所有广告推荐
2022/04/19 数码科技