PHP加密解密字符串汇总


Posted in PHP onApril 26, 2015

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。
最常见的应用在用户登录以及一些API数据交换的场景。

笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

1、非常给力的authcode加密函数,Discuz!经典代码(带详解): 

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));  
  }  
}

函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。
用法:

$str = 'abcdef'; 
$key = 'www.helloweba.com'; 
echo authcode($str,'ENCODE',$key,0); //加密 
$str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk'; 
echo authcode($str,'DECODE',$key,0); //解密

2、加解密函数encrypt():

function encrypt($string,$operation,$key=''){ 
  $key=md5($key); 
  $key_length=strlen($key); 
   $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; 
  $string_length=strlen($string); 
  $rndkey=$box=array(); 
  $result=''; 
  for($i=0;$i<=255;$i++){ 
      $rndkey[$i]=ord($key[$i%$key_length]); 
    $box[$i]=$i; 
  } 
  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=='D'){ 
    if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ 
      return substr($result,8); 
    }else{ 
      return''; 
    } 
  }else{ 
    return str_replace('=','',base64_encode($result)); 
  } 
}

函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
用法:

$str = 'abc'; 
$key = 'www.helloweba.com'; 
$token = encrypt($str, 'E', $key); 
echo '加密:'.encrypt($str, 'E', $key); 
echo '解密:'.encrypt($str, 'D', $key);

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
PHP个人网站架设连环讲(二)
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
动态生成gif格式的图像要注意?
Oct 09 PHP
php相当简单的分页类
Oct 02 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 PHP
php开发中的页面跳转方法总结
Apr 26 #PHP
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
Apr 26 #PHP
PHP开启opcache提升代码性能
Apr 26 #PHP
php格式化电话号码的方法
Apr 24 #PHP
php生成年月日下载列表的方法
Apr 24 #PHP
PHP传参之传值与传址的区别
Apr 24 #PHP
php获取访问者IP地址汇总
Apr 24 #PHP
You might like
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
jquery操作cookie插件分享
2014/01/14 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
Javascript Objects详解
2014/09/04 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
javascript 应用小技巧方法汇总
2015/07/05 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
2019/11/07 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
深入讲解Python编程中的字符串
2015/10/14 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
在Keras中实现保存和加载权重及模型结构
2020/06/15 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
Ruby如何进行文件操作
2014/07/17 面试题
护理学院专科毕业生求职信
2014/06/28 职场文书
毕业生应聘求职信
2014/07/10 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js