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一些常用的正则表达式字符的一些转换
Jul 29 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
PHP文件上传主要代码讲解
Sep 30 PHP
PHP COOKIE及时生效的方法介绍
Feb 14 PHP
关于PHP中Session文件过多的问题及session文件保存位置
Mar 17 PHP
深入分析PHP优化及注意事项
Jul 04 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 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
Cappuccino 卡布其诺咖啡之制作
2021/03/03 冲泡冲煮
PHP无限分类的类
2007/01/02 PHP
PHP 一个随机字符串生成代码
2010/05/26 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
php使用redis的几种常见操作方式和用法示例
2020/02/20 PHP
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
Bootstrap3 input输入框插入glyphicon图标的方法
2016/05/16 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
js+html5生成自动排列对话框实例
2017/10/09 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
Python中import机制详解
2017/11/14 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python实现最大子序和(分治+动态规划)
2019/07/05 Python
Django框架 querySet功能解析
2019/09/04 Python
Django中的AutoField字段使用
2020/05/18 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
电子商务专业推荐信范文
2013/12/02 职场文书
5s推行计划书
2014/05/06 职场文书
企业年检委托书范本
2014/10/14 职场文书
装配车间主任岗位职责
2015/04/08 职场文书
活动新闻稿范文
2015/07/17 职场文书
JavaScript实现贪吃蛇游戏
2021/06/16 Javascript
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB