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 相关文章推荐
我的论坛源代码(二)
Oct 09 PHP
PHP chmod 函数与批量修改文件目录权限
May 10 PHP
php生成shtml类用法实例
Dec 09 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
PHP消息队列用法实例分析
Feb 12 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
Aug 05 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
由php的call_user_func传reference引发的思考
2010/07/23 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
node.js读取Excel数据(下载图片)的方法示例
2018/08/02 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
Java文件与类动手动脑实例详解
2019/11/10 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
塔吉特百货公司官网:Target
2017/04/27 全球购物
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
毕业生造价工程师求职信
2013/10/17 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
医生个人自我剖析材料
2014/10/08 职场文书
初中中等生评语
2014/12/29 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
罚款通知怎么写
2015/04/22 职场文书
单位接收证明格式
2015/06/18 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技