2个比较经典的PHP加密解密函数分享


Posted in PHP onJuly 01, 2014

项目中有时我们需要使用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 相关文章推荐
我的论坛源代码(四)
Oct 09 PHP
Discuz! Passport 通行证整合
Mar 27 PHP
php学习之 数组声明
Jun 09 PHP
批量获取memcache值并按key的顺序返回的实现代码
Jun 14 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
php发送http请求的常用方法分析
Nov 08 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
php中的钩子理解及应用实例分析
Aug 30 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 #PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 #PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 #PHP
ThinkPHP模板IF标签用法详解
Jul 01 #PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 #PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 #PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
Jun 30 #PHP
You might like
PHP安全配置
2006/10/09 PHP
个人站长制做网页常用的php代码
2007/03/03 PHP
PHP 翻页 实例代码
2009/08/07 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
php检测图片主要颜色的方法
2015/07/01 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
PHP实现的只保留字符串首尾字符功能示例【隐藏部分字符串】
2019/03/11 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
js 蒙版进度条(结合图片)
2010/03/10 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
javascript实现动态标签云
2015/10/16 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
如何使用python写截屏小工具
2020/09/29 Python
英国领先的维生素和营养补充剂直接供应商:Healthspan
2019/04/22 全球购物
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
Ajax实现页面无刷新留言效果
2021/03/24 Javascript
中学家长会邀请函
2014/01/17 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
销售内勤岗位职责
2015/02/10 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript