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预定义常量
Dec 25 PHP
PHP 实现explort() 功能的详解
Jun 20 PHP
注意:php5.4删除了session_unregister函数
Aug 05 PHP
php面向对象中的魔术方法中文说明
Mar 04 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php输出全球各个时区列表的方法
Mar 31 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
May 23 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
设定php简写功能的方法
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
php 结果集的分页实现代码
2009/03/10 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
php unlink()函数使用教程
2018/07/12 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
使一个函数作为另外一个函数的参数来运行的javascript代码
2007/08/13 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
2015/07/01 Javascript
JS实现自动变化的导航菜单效果代码
2015/09/09 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
解决angularjs WdatePicker ng-model的问题
2018/09/13 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
答题辅助python代码实现
2018/01/16 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
Python实现名片管理系统
2020/02/14 Python
基于python实现微信好友数据分析(简单)
2020/02/16 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
黑猩猩商店:The Chimp Store
2020/02/12 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
房地产管理毕业生自荐信
2013/11/04 职场文书
军训心得体会
2013/12/31 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
浅谈python中的多态
2021/06/15 Python
各国货币符号大全
2022/02/17 杂记
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript