详解 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获取金书网的书名的实现代码
Jun 11 PHP
PHP IN_ARRAY 函数使用注意事项
Jul 24 PHP
php在线代理转向代码
May 05 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
深入分析PHP引用(&amp;)
Sep 04 PHP
smarty简单应用实例
Nov 03 PHP
php简单实现数组分页的方法
Apr 30 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
May 13 PHP
ThinkPHP3.2.1图片验证码实现方法
Aug 19 PHP
php基于websocket搭建简易聊天室实践
Oct 24 PHP
php封装的验证码类分享
Feb 26 PHP
PHP asXML()函数讲解
Feb 03 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判断变量的函数
2012/04/24 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
jquery学习总结(超级详细)
2014/09/04 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
详解XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
2016/09/14 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
bootstrap里bootstrap动态加载下拉框的实例讲解
2018/08/10 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[52:06]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python的设计模式编程入门指南
2015/04/02 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python 瀑布线指标编写实例
2020/06/03 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
华美博弈C/VC工程师笔试试题
2012/07/16 面试题
学习党课思想汇报
2013/12/29 职场文书
应届大专生求职信
2014/06/26 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS