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如何得到当前页和上一页的地址?
Nov 27 PHP
PHP clearstatcache()函数详解
Mar 02 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
Aug 15 PHP
Yii框架引入coreseek分页功能示例
Feb 08 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
PHP使用递归按层级查找数据的方法
Nov 10 PHP
TP5框架实现的数据库备份功能示例
Apr 05 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开发中常用的字符串操作函数
2011/02/08 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php设计模式之单例模式代码
2016/06/11 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
jquery.cookie.js的介绍与使用方法
2017/02/09 Javascript
vue-loader教程介绍
2017/06/14 Javascript
vue.js学习之vue-cli定制脚手架详解
2017/07/02 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
使用p5.js临摹动态图形
2019/10/23 Javascript
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
Python常用的爬虫技巧总结
2016/03/28 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
python3中bytes和string之间的互相转换
2017/02/09 Python
python实现简单登陆流程的方法
2018/04/22 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
pandas实现导出数据的四种方式
2020/12/13 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
班级入场式解说词
2014/02/01 职场文书
保险专业求职信
2014/07/07 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
男人帮观后感
2015/06/18 职场文书
圣诞晚会主持词
2015/07/01 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript