详解 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程序?
Dec 08 PHP
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
PHP 采集心得技巧
May 15 PHP
解析crontab php自动运行的方法
Jun 24 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
php中创建和调用webservice接口示例
Jul 25 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
PHP Reflection API详解
May 12 PHP
Smarty实现页面静态化(生成HTML)的方法
May 23 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 PHP
laravel使用redis队列实例讲解
Mar 23 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
Laravel 修改验证异常的响应格式实例代码详解
2020/05/25 PHP
javascript模拟订火车票和退票示例
2014/04/24 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
在Windows8上的搭建Python和Django环境
2014/07/03 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
浅析python协程相关概念
2018/01/20 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
python用列表生成式写嵌套循环的方法
2018/11/08 Python
详解Python 解压缩文件
2019/04/09 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
浅谈html5之sse服务器发送事件EventSource介绍
2017/08/28 HTML / CSS
大学生毕业自我鉴定范文
2014/02/03 职场文书
竞争上岗实施方案
2014/03/21 职场文书
小学教师寄语大全
2014/04/03 职场文书
体育教师个人工作总结
2015/02/09 职场文书
担保贷款承诺书
2015/04/30 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python