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 相关文章推荐
mysql limit查询优化分析
Nov 12 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
Jan 15 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
Nov 04 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
PHP整合PayPal支付
Jun 11 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
Nov 05 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
php获取微信基础接口凭证Access_token
Aug 23 PHP
PHP实现简易计算器功能
Aug 28 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 PHP
PHP7 新增常量
Mar 09 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
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
jQuery 2.0.3 源码分析之core(一)整体架构
2014/05/27 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
[03:34]2014DOTA2西雅图国际邀请赛 淘汰赛7月15日TOPPLAY
2014/07/15 DOTA
python实现的简单窗口倒计时界面实例
2015/05/05 Python
Python 爬虫的工具列表大全
2016/01/31 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
关于Django Models CharField 参数说明
2020/03/31 Python
Linux系统下升级pip的完整步骤
2021/01/31 Python
Reebonz中国官网:新加坡奢侈品购物网站
2017/03/17 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
木马的传播途径主要有哪些
2016/04/08 面试题
群众路线剖析材料
2014/02/02 职场文书
发展部经理职责规定
2014/02/22 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
小学运动会加油词
2015/07/18 职场文书
python编写五子棋游戏
2021/05/25 Python
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript