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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
Jun 05 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
Aug 20 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
Oct 20 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 PHP
php的lavarel框架中join和orWhere的用法
Dec 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
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
JQuery控制DIV的选取实现方法
2016/09/18 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
原生js更改css样式的两种方式
2017/03/15 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
详解Nodejs内存治理
2018/05/13 NodeJs
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
Python list操作用法总结
2015/11/10 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
用Python shell简化开发
2018/08/08 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
通过python-pptx模块操作ppt文件的方法
2020/12/26 Python
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
后勤自我鉴定
2013/10/13 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
大学生军训感想
2014/02/16 职场文书
学校安全责任书
2014/04/14 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android
KVM基础命令详解
2022/04/30 Servers