详解 PHP加密解密字符串函数附源码下载


Posted in PHP onDecember 18, 2015

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。

下面先给大家展示下效果图,感兴趣的朋友继续阅读全文。

详解 PHP加密解密字符串函数附源码下载

效果演示     源码下载

笔者收录了一些比较经典的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 相关文章推荐
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
php中sql注入漏洞示例 sql注入漏洞修复
Jan 24 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
php验证码的制作思路和实现方法
Nov 12 PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 PHP
详解PHP使用Redis存储session时的一个Warning定位
Jul 05 PHP
mongodb和php的用法详解
Mar 25 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
laravel 数据验证规则详解
Oct 23 PHP
Laravel实现批量更新多条数据
Apr 06 PHP
PHP封装的字符串加密解密函数
Dec 18 #PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
Dec 17 #PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 #PHP
简介WordPress中用于获取首页和站点链接的PHP函数
Dec 17 #PHP
WordPress中查询文章的循环Loop结构及用法分析
Dec 17 #PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 #PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 #PHP
You might like
php 图像函数大举例(非原创)
2009/06/20 PHP
php模块memcache和memcached区别分析
2011/06/14 PHP
mysql总结之explain
2012/02/27 PHP
php实现登录页面的简单实例
2019/09/29 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
javascript数组组合成字符串的脚本
2021/01/06 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
jquery队列函数用法实例
2014/12/16 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
Vue表单实例代码
2016/09/05 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
python在指定目录下查找gif文件的方法
2015/05/04 Python
python统计文本文件内单词数量的方法
2015/05/30 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
python3获取url文件大小示例代码
2019/09/18 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
世界上最大的二手相机店:KEN
2017/05/17 全球购物
蜜蜂引路教学反思
2014/02/04 职场文书
机修工工作职责
2014/02/21 职场文书
百日安全生产活动总结
2014/07/05 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
美丽的大脚观后感
2015/06/03 职场文书