PHP实现的XXTEA加密解密算法示例


Posted in PHP onAugust 28, 2018

本文实例讲述了PHP实现的XXTEA加密解密算法。分享给大家供大家参考,具体如下:

<?php
/**
 * Xxtea 加密实现类
 */
class xxtea {
  private function long2str($v, $w) {
    $len = count($v);
    $n = ($len -1) << 2;
    if ($w) {
      $m = $v[$len -1];
      if (($m < $n -3) || ($m > $n))
        return false;
      $n = $m;
    }
    $s = array ();
    for ($i = 0; $i < $len; $i++)
      $s[$i] = pack("V", $v[$i]);
    return $w ? substr(implode('', $s), 0, $n) : implode('', $s);
  }
  private function str2long($s, $w) {
    $v = unpack("V*", $s . str_repeat("/0", (4 - strlen($s) % 4) & 3));
    $v = array_values($v);
    if ($w)
      $v[count($v)] = strlen($s);
    return $v;
  }
  private function int32($n) {
    while ($n >= 2147483648)
      $n -= 4294967296;
    while ($n <= 2147483649)
      $n += 4294967296;
    return (int) $n;
  }
  public function encrypt($str, $key) {
    if ($str == '')
      return '';
    $v = $this->str2long($str, true);
    $k = $this->str2long($key, false);
    if (count($k) < 4)
      for ($i = count($k); $i < 4; $i++)
        $k[$i] = 0;
    $n = count($v) - 1;
    $z = $v[$n];
    $y = $v[0];
    $delta = 0x9E3779B9;
    $q = floor(6 + 52 / ($n +1));
    $sum = 0;
    while (0 < $q--) {
      $sum = $this->int32($sum + $delta);
      $e = $sum >> 2 & 3;
      for ($p = 0; $p < $n; $p++) {
        $y = $v[$p +1];
        $mx = $this->int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ $this->int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
        $z = $v[$p] = $this->int32($v[$p] + $mx);
      }
      $y = $v[0];
      $mx = $this->int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ $this->int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
      $z = $v[$n] = $this->int32($v[$n] + $mx);
    }
    return $this->long2str($v, false);
  }
  public function decrypt($str, $key) {
    if ($str == '')
      return '';
    $v = $this->str2long($str, false);
    $k = $this->str2long($key, false);
    if (count($k) < 4)
      for ($i = count($k); $i < 4; $i++)
        $k[$i] = 0;
    $n = count($v) - 1;
    $z = $v[$n];
    $y = $v[0];
    $delta = 0x9E3779B9;
    $q = floor(6 + 52 / ($n +1));
    $sum = $this->int32($q * $delta);
    while ($sum != 0) {
      $e = $sum >> 2 & 3;
      for ($p = $n; $p > 0; $p--) {
        $z = $v[$p -1];
        $mx = $this->int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ $this->int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
        $y = $v[$p] = $this->int32($v[$p] - $mx);
      }
      $z = $v[$n];
      $mx = $this->int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ $this->int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
      $y = $v[0] = $this->int32($v[0] - $mx);
      $sum = $this->int32($sum - $delta);
    }
    return $this->long2str($v, true);
  }
}
//用法测试:
$strDemo = "3water.com";
$key = "123456";
$pwd = new Xxtea();
$pwdrel = $pwd->encrypt($strDemo, $key);
echo $pwdrel;
echo "<br/>";
echo $pwd->decrypt($pwdrel, $key);
?>

运行结果:

{���H(�S��7*�u7U
3water.com

PHP 相关文章推荐
PHP+DBM的同学录程序(3)
Oct 09 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP四舍五入、取整、round函数使用示例
Feb 06 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
前端必学之PHP语法基础
Jan 01 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
php用xpath解析html的代码实例讲解
Feb 14 PHP
Laravel多域名下字段验证的方法
Apr 04 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 04 PHP
Yii Framework框架开发微信公众平台示例
Apr 26 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 #PHP
PHP连接sftp并下载文件的方法教程
Aug 26 #PHP
PHP操作Redis数据库常用方法示例
Aug 25 #PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 #PHP
PHP与以太坊交互详解
Aug 24 #PHP
php获取微信基础接口凭证Access_token
Aug 23 #PHP
php对微信支付回调处理的方法
Aug 23 #PHP
You might like
php基础知识:控制结构
2006/12/13 PHP
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
PHP缓存技术的使用说明
2011/08/06 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
简单实现轮播图效果的实例
2016/07/15 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
vue小白入门教程
2018/04/02 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
[02:37]2015国际邀请赛选手档案—LGD.Xiao8
2015/07/28 DOTA
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
简单谈谈python的反射机制
2016/06/28 Python
对python中return和print的一些理解
2017/08/18 Python
python+mysql实现教务管理系统
2019/02/20 Python
python实现控制COM口的示例
2019/07/03 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Python Opencv中用compareHist函数进行直方图比较对比图片
2020/04/07 Python
美国高街时尚品牌:OASAP
2016/07/24 全球购物
导购员的岗位职责
2014/02/08 职场文书
产品质量承诺书范文
2014/03/27 职场文书
升学宴主持词
2014/04/02 职场文书
学习心理学的体会
2014/11/07 职场文书
师德承诺书
2015/01/20 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技