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手册及PHP编程标准
Dec 17 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
php小偷相关截取函数备忘
Nov 28 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
php实现建立多层级目录的方法
Jul 19 PHP
php隐藏IP地址后两位显示为星号的方法
Nov 21 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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
生成缩略图
2006/10/09 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
jquery自定义类似$.ajax()的方法实现代码
2013/08/13 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
js跳转页面方法总结
2014/01/29 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
axios拦截设置和错误处理方法
2018/03/05 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
python实现人脸识别代码
2017/11/08 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python获取基金网站网页内容、使用BeautifulSoup库分析html操作示例
2019/06/04 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
Django 实现将图片转为Base64,然后使用json传输
2020/03/27 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
C语言中break与continue的区别
2012/07/12 面试题
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
库房主管岗位职责
2013/12/31 职场文书
逃课上网检讨书
2014/02/20 职场文书
党员志愿者活动总结
2014/06/26 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle