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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
关于Intype一些小问题的解决办法
Mar 28 PHP
php adodb分页实现代码
Mar 19 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
PHP中类的继承和用法实例分析
May 24 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
CI框架无限级分类+递归的实现代码
Nov 01 PHP
PHP实现上传图片到数据库并显示输出的方法
May 31 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
Swoole扩展的6种模式深入详解
Mar 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 时间转换Unix时间戳代码
2010/01/22 PHP
PHP中call_user_func_array()函数的用法演示
2012/02/05 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
php查询及多条件查询
2017/02/26 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
jQuery获取和设置表单元素的方法
2014/02/14 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
JS判断字符串变量是否含有某个字串的实现方法
2016/06/03 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
JavaScript字符集编码与解码详谈
2017/02/02 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
详解Python中的四种队列
2018/05/21 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
如何理解python面向对象编程
2020/06/01 Python
JAVA和C++的区别
2013/10/06 面试题
民事诉讼授权委托书范文
2014/08/02 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
入队仪式主持词
2015/07/04 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
实战 快速定位MySQL的慢SQL
2022/03/22 MySQL
python中urllib包的网络请求教程
2022/04/19 Python
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers