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 相关文章推荐
php设计模式 Prototype (原型模式)代码
Jun 26 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
优化PHP代码技巧的小结
Jun 02 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
php通过function_exists检测函数是否存在的方法
Mar 18 PHP
PHP简单生成缩略图相册的方法
Jul 29 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
Dec 12 PHP
PHP isset()与empty()的使用区别详解
Feb 10 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 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/09/05 PHP
PHP中模拟链表和链表的基本操作示例
2016/02/27 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
BootStrap Fileinput初始化时的一些参数
2016/12/30 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
jQuery实现的粘性滚动导航栏效果实例【附源码下载】
2017/10/19 jQuery
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
Vue的Options用法说明
2020/08/14 Javascript
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
利用PyCharm Profile分析异步爬虫效率详解
2019/05/08 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
python 实现让字典的value 成为列表
2019/12/16 Python
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
高中毕业生的个人自我评价
2014/02/21 职场文书
素质教育标语
2014/06/27 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
永不妥协观后感
2015/06/10 职场文书
赡养老人协议书范本
2015/08/06 职场文书
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
opencv读取视频并保存图像的方法
2021/06/04 Python
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android