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中路径问题的解决方案
Oct 09 PHP
文章推荐系统(三)
Oct 09 PHP
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
php购物网站支付paypal使用方法
Nov 28 PHP
php Smarty 字符比较代码
Feb 27 PHP
修改apache配置文件去除thinkphp url中的index.php
Jan 17 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
PHP中实现Bloom Filter算法
Mar 30 PHP
php使用数组填充下拉列表框的方法
Mar 31 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
php tpl模板引擎定义与使用示例
Aug 09 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
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
Javascript与vbscript数据共享
2007/01/09 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
js表头排序实现方法
2015/01/16 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)
2018/02/08 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
jQuery实现购物车全功能
2021/01/11 jQuery
详解python进行mp3格式判断
2016/12/23 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Django的性能优化实现解析
2019/07/30 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
python实现将一维列表转换为多维列表(numpy+reshape)
2019/11/29 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
联想新加坡官方网站:Lenovo Singapore
2017/10/24 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
外贸学院会计专业应届生求职信
2013/11/14 职场文书
银行介绍信范文
2014/01/10 职场文书
岗位工作说明书
2014/07/29 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
检察院起诉意见书
2015/05/20 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python