PHP封装的字符串加密解密函数


Posted in PHP onDecember 18, 2015

程序中经常使用的PHP加密解密字符串函数

代码如下:

/*********************************************************************
 函数名称:encrypt
 函数作用:加密解密字符串
 使用方法:
 加密  :encrypt('str','E','nowamagic');
 解密  :encrypt('被加密过的字符串','D','nowamagic');
 参数说明:
 $string :需要加密解密的字符串
 $operation:判断是加密还是解密:E:加密 D:解密
 $key  :加密的钥匙(密匙);
*********************************************************************/
 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));
  }
 }

使用方法:

$id = 132;
 
$token = encrypt($id, 'E', 'a');
 
echo '加密:'.encrypt($id, 'E', 'a');
echo '<br />';
 
echo '解密:'.encrypt($token, 'D', 'a');

非常给力的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); //解密

3、加解密函数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 相关文章推荐
PHP4中实现动态代理
Oct 09 PHP
mysql建立外键
Nov 25 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP5.3与5.5废弃与过期函数整理汇总
Jul 10 PHP
Symfony2创建页面实例详解
Mar 18 PHP
php单链表实现代码分享
Jul 04 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
May 23 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
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 #PHP
You might like
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
Javascript中神奇的this
2016/01/20 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
2017/07/03 Javascript
vue超时计算的组件实例代码
2018/07/09 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
Python实现生成密码字典的方法示例
2019/09/02 Python
python如何基于redis实现ip代理池
2020/01/17 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
Python爬取梨视频的示例
2021/01/29 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
家长反馈意见及建议
2015/06/03 职场文书
学习党章心得体会2016
2016/01/15 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书