详解 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 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
php不用正则验证真假身份证
Nov 06 PHP
根据中文裁减字符串函数的php代码
Dec 03 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
PHP加密技术的简单实现
Sep 04 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP时间相关常用函数用法示例
Jun 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中的curl使用入门教程和常见用法实例
2014/04/10 PHP
PHP实现的MongoDB数据库操作类分享
2014/05/12 PHP
取得单条网站评论以数组形式进行输出
2014/07/28 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
mysql alter table命令修改表结构实例详解
2016/09/24 PHP
PHPCMS手机站伪静态设置详细教程
2017/02/06 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
javascript折半查找详解
2015/01/26 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
使用ajaxfileupload.js实现上传文件功能
2016/08/13 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
Python入门学习指南分享
2018/04/11 Python
python实现多人聊天室
2020/03/31 Python
django数据模型on_delete, db_constraint的使用详解
2019/12/24 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
2020/01/08 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
中级会计职业生涯规划书
2014/03/01 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
2014会计年终工作总结
2014/12/20 职场文书
css样式important规则的正确使用方式
2022/06/10 HTML / CSS