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中的串行化变量和序列化对象
Sep 05 PHP
php的一个登录的类 [推荐]
Mar 16 PHP
php中文本操作的类
Mar 17 PHP
轻松修复Discuz!数据库
May 03 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
Jan 17 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
[原创]PHP字符串中插入子字符串方法总结
May 06 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
PHP使用函数用法详解
Sep 30 PHP
thinkPHP框架中layer.js的封装与使用方法示例
Jan 18 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/06 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
JS实现图片拖拽交换效果
2018/11/30 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
Pycharm最新激活码2019(推荐)
2019/12/31 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
基于python实现查询ip地址来源
2020/06/02 Python
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
师范大学毕业自我鉴定
2013/11/21 职场文书
我的网上商城创业计划书
2013/12/26 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
社区元宵节活动总结
2015/02/06 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
神秘岛读书笔记
2015/07/01 职场文书
创业计划书之烤红薯
2019/09/26 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android