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学习笔记之三 数据库基本操作
Jan 17 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
May 10 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
PHP获取当前页面URL函数实例
Oct 22 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
Jan 16 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
PHP基于swoole多进程操作示例
Aug 12 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
PHP如何利用P3P实现跨域
2013/08/24 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
js浮点数精确计算(加、减、乘、除)
2013/12/26 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
JS修改地址栏参数实例代码
2016/06/14 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
JS控制GIF图片的停止与显示
2019/10/24 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python解析基于xml格式的日志文件
2017/02/25 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
python实现人脸签到系统
2020/04/13 Python
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
毕业生求职简历中的自我评价
2013/10/18 职场文书
函授自我鉴定
2013/11/06 职场文书
记者岗位职责
2014/01/06 职场文书
大学生创业感言
2014/01/25 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书