这篇文章主要介绍了2个比较经典的PHP加密解密函数分享,一个是Discuz!的authcode加密函数(带详细分解),一个是encrypt()函数,都比较经典,需要的朋友可以参考下

项目中有时我们需要使用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);

2个比较经典的PHP加密解密函数分享相关推荐

  1. 加密解密php,2个比较经典的PHP加密解密函数分享

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理. 最常见的应用在用户登录以及一些AP ...

  2. php中的base64,php中base64_decode与base64_encode加密解密函数

    php中base64_decode与base64_encode加密解密函数,实例分析了base64加密解密函数的具体用法,具有一定的实用价值,需要的朋友可以参考下 本文实例讲述了php中base64_ ...

  3. 六个经典的PHP加密解密算法

    六个经典的PHP加密解密算法 六个经典的PHP加密解密算法 非常给力的authcode加密函数,Discuz!经典代码(带详解) 函数authcode($string, $operation, $ke ...

  4. php动态密码和加密解密函数的使用(动态密码、Discuz核心函数AuthCode、任意输入密码验证)

    php加密解密的使用 一.项目说明 二.项目分析 1.js外部文件 2.HTML容器构建 3.layui前端验证 4.php后端验证 封装函数 密码验证规则 strpos内置函数 三.经典的核心加密函 ...

  5. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  6. php可逆加密解密函数,php 好用可逆的 加密解密 函数。

    php 好用可逆的加密解密函数. function encode($content, $key = 'pass' ) { // 加密数据的函数 , 主要进行移位操作 $key = md5($key); ...

  7. 字符串加密解密函数 (C#) (转)

    字符串加密解密函数 (C#) (转) 字符串加密解密函数 (C#) using System; using System.Text; using System.Security.Cryptograph ...

  8. 自己实现的php加密解密函数结果纯字母和数字

    php自带的base64加密解密函数大部分人都知道,加密后很容易被解密,所以就自己实现的php加密解密函数,密文是字母和数字组合. <?php /* *加密 */ function encode ...

  9. 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)

    普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语言时这类可逆函数非常难搞定.所以这时尽量使用AES DES RC4 Rabb ...

  10. JavaScript 自写加密解密函数

    JavaScript 自写加密解密函数 版权声明:本文为CSDN博主「zshsats」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https:// ...

最新文章

  1. SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)...
  2. Windows删除指定时间之前指定后缀名的文件
  3. vb.net2019-播放声音(wav、mp3等)
  4. tf.nn.softmax
  5. NLP《词汇表示方法(四)负采样》
  6. php获取类的实例变量
  7. 大数据Vue项目案例总结
  8. 电子与电工技术实验——集成运算放大器的应用
  9. 人工晶状体在线公式A常数优化
  10. 计算机管理格式化没有顺利完成,TF存储卡“格式化没有顺利完成”问题解决的方法...
  11. matlab 阶梯形矩阵,求化矩阵为阶梯型矩阵的代码(不是行最简函数rref)
  12. HTML---网页编程(1)
  13. 图片怎么转换成PDF,这三个方法轻松搞定!
  14. 美团饿了么外卖返利cps项目可以给你带来什么?
  15. Zookeeper 集群模式搭建
  16. 高效工作的一个绝招:一心二用(听歌,听知识等)
  17. redis源码解析(二)——SDS(简单动态字符串)
  18. jdbc.IncorrectResultSetColumnCountException: Incorrect column count: expected 1, actual 14
  19. redhat linux光盘4,技巧:把3张Redhat Linux 9的安装光盘刻录到一张DVD光盘中
  20. Linux网络项目实验------网络架构(DNS域名解析、NFS共享服务、LAMP服务、搭建论坛、PXE自动装机)

热门文章

  1. 智能优化算法:自私羊群优化算法-附代码
  2. python绘图-增加子区域
  3. Endnote X8 #安装%办法与*安装*包%
  4. 服务器中C盘的虚拟大文件,查看虚拟机的大文件系统
  5. 文科可报考计算机专业会怎样,高考志愿填报文科考生能够报考计算机吗?哪些学校会有招生?...
  6. 如何在 Flink 1.9 中使用 Hive?
  7. 我与潘家园金爷的对话
  8. java 单例 初始化_单例数据库对象启动时参数化初始化?
  9. 中limit怎末用_Nginx配置——关于limit_conn_zone和limit_conn
  10. fan类java_Java常用类