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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php数据类型判断函数有哪些
Sep 23 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
laravel 4安装及入门图文教程
Oct 29 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
php利用嵌套数组拼接与解析json的方法
Feb 07 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP实现重载的常用方法实例详解
Oct 18 PHP
PHP微信开发之微信录音临时转永久存储
Jan 26 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
php5编程中的异常处理详细方法介绍
2008/07/29 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
单台服务器的PHP进程之间实现共享内存的方法
2014/06/13 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
JavaScript 高级语法介绍
2009/06/15 Javascript
初识Javascript小结
2015/07/16 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
Python标准库之循环器(itertools)介绍
2014/11/25 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
python的继承知识点总结
2018/12/10 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
基于Python测试程序是否有错误
2020/05/16 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
土木工程毕业生推荐信
2013/10/28 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
请假条格式范文
2014/04/10 职场文书
铁人纪念馆观后感
2015/06/16 职场文书
小学生暑假安全公约
2015/07/14 职场文书
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers
Java中的Kotlin 内部类原理
2022/06/16 Java/Android