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 相关文章推荐
APMServ使用说明
Oct 23 PHP
PHP中$_SERVER的详细参数与说明
Jul 29 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
Oct 29 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
php连接函数implode与分割explode的深入解析
Jun 26 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
Jun 19 PHP
php比较两个字符串长度的方法
Jul 13 PHP
php强大的时间转换函数strtotime
Feb 18 PHP
解决微信授权回调页面域名只能设置一个的问题
Dec 11 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 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和ACCESS写聊天室(一)
2006/10/09 PHP
PHP钩子实现方法解析
2019/05/21 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
点图片上一页下一页翻页效果
2008/07/09 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
JavaScript 判断一个对象{}是否为空对象的简单方法
2016/10/09 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python help函数实例用法
2020/12/06 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
canvas探照灯效果的示例代码
2018/11/30 HTML / CSS
写自荐信的七个技巧
2013/10/15 职场文书
会计顶岗实习心得
2014/01/25 职场文书
优秀女职工事迹材料
2014/02/06 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
学校课外活动总结
2014/05/08 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
优秀高中学生评语
2014/12/30 职场文书
高中教师个人总结
2015/02/10 职场文书
酒店厨房管理制度
2015/08/06 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers