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在字符串中查找另一个字符串
Nov 19 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
PHPUnit PHP测试框架安装方法
Mar 23 PHP
php中http_build_query 的一个问题
Mar 25 PHP
浅析PHP页面局部刷新功能的实现小结
Jun 21 PHP
深入解析phpCB批量转换的代码示例
Jun 27 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP类相关知识点实例总结
Sep 28 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 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
yii框架源码分析之创建controller代码
2011/06/28 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
2014/08/27 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
js获取字符串字节数方法小结
2015/06/09 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
javascript 中事件冒泡和事件捕获机制的详解
2017/09/01 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
详解python基础之while循环及if判断
2017/08/24 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
tensorflow查看ckpt各节点名称实例
2020/01/21 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
优秀大学生推荐信范文
2013/11/28 职场文书
公司成立感言
2014/01/11 职场文书
不假外出检讨书
2014/01/27 职场文书
借款担保书范文
2014/05/13 职场文书
外国人来华邀请函
2015/01/31 职场文书
乡镇安全生产月活动总结
2015/05/08 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
Python OpenCV形态学运算示例详解
2022/04/07 Python