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下判断数组中是否存在相同的值array_unique
Mar 25 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
解析php中call_user_func_array的作用
Jun 07 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
mongodb和php的用法详解
Mar 25 PHP
PHP中Session ID的实现原理实例分析
Aug 17 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
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
python实现SMTP邮件发送功能
2020/06/16 Python
Pandas之排序函数sort_values()的实现
2019/07/09 Python
Python大数据之网络爬虫的post请求、get请求区别实例分析
2019/11/16 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python中os模块功能与用法详解
2020/02/26 Python
深入浅出CSS3 background-clip,background-origin和border-image教程
2011/01/27 HTML / CSS
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
New Balance英国官方网站:始于1906年,百年慢跑品牌
2016/12/07 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
消防安全宣传标语
2014/06/07 职场文书
安全标语口号
2014/06/09 职场文书
公司授权委托书范文
2014/09/21 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
Java中API的使用方法详情
2022/04/06 Java/Android
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python