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 相关文章推荐
dedecms系统常用术语汇总
Apr 03 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
php的array_multisort()使用方法介绍
May 16 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
使用php+swoole对client数据实时更新(一)
Jan 07 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
PHP页面输出搜索后跳转下一页的处理方法
Sep 30 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
PHP CURL使用详解
Mar 21 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中创建和调用webservice接口示例
2014/07/25 PHP
基于递归实现的php树形菜单代码
2014/11/19 PHP
php实现二进制和文本相互转换的方法
2015/04/18 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
2020/08/26 Javascript
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
小学语文国培感言
2014/03/04 职场文书
销售活动策划方案
2014/08/26 职场文书
辞职信如何写
2015/02/27 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
《穷人》教学反思
2016/02/19 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android