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 相关文章推荐
ubuntu 编译安装php 5.3.3+memcache的方法
Aug 05 PHP
php更新mysql后获取改变行数的方法
Dec 25 PHP
php解析字符串里所有URL地址的方法
Apr 03 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
Yii2实现同时搜索多个字段的方法
Aug 10 PHP
PHP实现导出excel数据的类库用法示例
Oct 15 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
PHP addAttribute()函数讲解
Feb 03 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
用PHP实现图象锐化代码
2007/06/14 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
php页面缓存方法小结
2015/01/10 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
Ajax基础知识详解
2017/02/17 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python编程之属性和方法实例详解
2015/05/19 Python
Python数据结构之单链表详解
2017/09/12 Python
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
python正则表达式去除两个特殊字符间的内容方法
2018/12/24 Python
详解python持久化文件读写
2019/04/06 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
详解python中各种文件打开模式
2020/01/19 Python
PHP面试题附答案
2015/11/28 面试题
市场营销调查计划书
2014/05/02 职场文书
九年级化学教学反思
2016/02/22 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
PYTHON InceptionV3模型的复现详解
2022/05/06 Python