php实现可逆加密的方法

 更新时间:2015年08月11日 11:07:37   作者:fdwqy  
这篇文章主要介绍了php实现可逆加密的方法,借鉴了discuz的加密原理实现通过密钥进行可逆加密的功能,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php实现可逆加密的方法。分享给大家供大家参考。具体如下:

这里介绍的可以逆转加密类,没有密钥很难破解。

PHP代码如下:

<?php
class encryptCalss
{
var $key=12;
function encode($txt){
for($i=0;$i<strlen($txt);$i++){
$txt[$i]=chr(ord($txt[$i])+$this->key);
}
return $txt=urlencode(base64_encode(urlencode($txt)));
}
function decode($txt){
$txt=urldecode(base64_decode($txt));
for($i=0;$i<strlen($txt);$i++){
$txt[$i]=chr(ord($txt[$i])-$this->key);
}
return $txt;
}
}
?>

discuz加密解密:

<?php
/**
 * 
 * @param string $string 原文或者密文
 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 * @param string $key 密钥
 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
 * @example 
 *  $a = authcode('abc', 'ENCODE', 'key');
 *  $b = authcode($a, 'DECODE', 'key'); // $b(abc)
 * 
 *  $a = authcode('abc', 'ENCODE', 'key', 3600);
 *  $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空
 */
function authcode($string,$operation='DECODE',$key='',$expiry=0){
  $ckey_length=4;
  $key=md5($key ? $key:"kalvin.cn");
  $keya=md5(substr($key,0,16));
  $keyb=md5(substr($key,16,16));
  $keyc=$ckey_length ? ($operation=='DECODE' ? substr($string,0,$ckey_length):substr(md5(microtime()),-$ckey_length)):'';
  $cryptkey=$keya.md5($keya.$keyc);
  $key_length=strlen($cryptkey);
  $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)){
      returnsubstr($result,26);
    }else{
      return'';
    }
  }else{
    return $keyc.str_replace('=','',base64_encode($result));
  }
}
?>

希望本文所述对大家的php程序设计有所帮助。

相关文章

  • PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    这篇文章主要介绍了PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式,需要的朋友可以参考下
    2014-05-05
  • PHP应用跨时区功能的实现方法

    PHP应用跨时区功能的实现方法

    今天小编就为大家分享一篇关于PHP应用跨时区功能的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • goto语法在PHP中的使用教程

    goto语法在PHP中的使用教程

    这篇文章主要给大家介绍了关于goto语法在PHP中的使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 隐性调用php程序的方法

    隐性调用php程序的方法

    比较通用的方法,下面是调用php简单的计数器。
    2009-03-03
  • 解决出现SoapFault (looks like we got no XML document)的问题

    解决出现SoapFault (looks like we got no XML document)的问题

    下面小编就为大家带来一篇解决出现SoapFault (looks like we got no XML document)的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • PHP中error_reporting()函数的用法(修改PHP屏蔽错误)

    PHP中error_reporting()函数的用法(修改PHP屏蔽错误)

    一般在默认的普通PHP文件中输出一个未定义声明的变量是不会报错误的,但在codeigniter框架下却要报错误,这对于想集成 添加 和 修改 页面于一体的”懒人”很不方便,由于是初学者开始还想怎么在代码中屏蔽这一错误提示呢.甚至用到了@,但听很多人都说@会大大降低性能.
    2011-07-07
  • php遍历删除整个目录及文件的方法

    php遍历删除整个目录及文件的方法

    这篇文章主要介绍了php遍历删除整个目录及文件的方法,涉及php操作目录及文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • PHP如何限制定时任务的进程数量

    PHP如何限制定时任务的进程数量

    这篇文章主要给大家介绍了关于PHP如何限制定时任务进程数量的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C# WinForm中实现快捷键自定义设置实例

    C# WinForm中实现快捷键自定义设置实例

    这篇文章主要介绍了对C# WinForm中实现快捷键自定义设置实例,本文实现了大多数软件如QQ、有道词典中的快捷键设置功能,即按下相应按键后显示在文本框中,需要的朋友可以参考下
    2015-01-01
  • centos7环境下swoole1.9的安装与HttpServer的使用方法分析

    centos7环境下swoole1.9的安装与HttpServer的使用方法分析

    这篇文章主要介绍了centos7环境下swoole1.9的安装与HttpServer的使用方法,结合实例形式分析了centos7环境下swoole1.9的安装、配置方法以及HttpServer的相关使用技巧,需要的朋友可以参考下
    2020-03-03

最新评论