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 相关文章推荐
PHP取进制余数函数代码
Jan 19 PHP
浅析PHP Socket技术
Aug 02 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
详谈PHP编码转换问题
Jul 28 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
php集成动态口令认证
Jul 21 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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
用header 发送cookie的php代码
2007/03/16 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
jQuery is()函数用法3例
2014/05/06 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
jQuery事件绑定方法学习总结(推荐)
2016/11/21 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
微信小程序之选项卡的实现方法
2017/09/29 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
JavaScript事件冒泡与事件捕获实例分析
2018/08/01 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
Python实现备份文件实例
2014/09/16 Python
Python3 正在毁灭 Python的原因分析
2014/11/28 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
Python 如何提高元组的可读性
2019/08/26 Python
Python线程指南分享
2019/11/19 Python
使用python实现名片管理系统
2020/06/18 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
HTML5 实战PHP之Web页面表单设计
2011/10/09 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
文体活动总结
2015/02/04 职场文书
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers