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基础教程 php内置函数实例教程
Aug 21 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
详解PHP导入导出CSV文件
Nov 03 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
Dec 17 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
php通过会话控制实现身份验证实例
Oct 18 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 PHP
Laravel5.1 框架表单验证操作实例详解
Jan 07 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 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
用Flash图形化数据(二)
2006/10/09 PHP
php编写一个简单的路由类
2011/04/13 PHP
php的hash算法介绍
2014/02/13 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
php swoft框架实例用法
2020/12/22 PHP
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
深入理解Node.js中通用基础设计模式
2017/09/19 Javascript
js调用设备摄像头的方法
2018/07/19 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
centos系统升级python 2.7.3
2014/07/03 Python
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python中多线程及程序锁浅析
2015/01/21 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
使用python编写监听端
2018/04/12 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
python 弧度与角度互转实例
2020/04/15 Python
Python面向对象实现方法总结
2020/08/12 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
工程招投标邀请书
2014/01/26 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
安全教育培训制度
2015/08/06 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
《去年的树》教学反思
2016/02/18 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server