详解 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树的代码,可以嵌套任意层
Oct 09 PHP
剖析 PHP 中的输出缓冲
Dec 21 PHP
php 伪造本地文件包含漏洞的代码
Nov 03 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
PHP版微信公众平台红包API
Apr 02 PHP
php二维码生成
Oct 19 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
php关闭warning问题的解决方法
May 17 PHP
Thinkphp5行为使用方法汇总
Dec 21 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
PHP实现15位身份证号转18位的方法分析
Oct 16 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中使用Oracle数据库(1)
2006/10/09 PHP
几个学习PHP的网址
2006/11/25 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
jQuery实现为图片添加镜头放大效果的方法
2015/06/25 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
深入理解JavaScript 函数
2016/06/06 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
BootStrap Tooltip插件源码解析
2016/12/27 Javascript
微信小程序 数据交互与渲染实例详解
2017/01/21 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
jQuery实现鼠标移入显示蒙版效果
2020/01/11 jQuery
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
django 自定义filter 判断if var in list的例子
2019/08/20 Python
python实现扫雷游戏
2020/03/03 Python
Django 自定义404 500等错误页面的实现
2020/03/08 Python
python中JWT用户认证的实现
2020/05/18 Python
python实现定时发送邮件
2020/12/23 Python
如何用Python提取10000份log中的产品信息
2021/01/14 Python
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
2014年药房工作总结
2014/11/22 职场文书
MongoDB数据库之添删改查
2022/04/26 MongoDB