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 相关文章推荐
我的群发邮件程序
Oct 09 PHP
php 执行系统命令的方法
Jul 07 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
php批量删除数据库下指定前缀的表以prefix_为例
Aug 24 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
Dec 20 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
Ubuntu上安装yaf扩展的方法
Jan 29 PHP
php实现记事本案例
Oct 20 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格式输出文件var_export函数实例
2014/11/15 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
javascript jq 弹出层实例
2013/08/25 Javascript
用RadioButten或CheckBox实现div的显示与隐藏
2013/09/21 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
用JavaScript和jQuery实现瀑布流
2017/03/19 Javascript
jQuery鼠标悬停内容动画切换效果
2017/04/27 jQuery
微信小程序scroll-view实现字幕滚动
2018/07/14 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
vue+axios+promise实际开发用法详解
2018/10/15 Javascript
基于jQuery实现挂号平台首页源码
2020/01/06 jQuery
Python数据结构之Array用法实例
2014/10/09 Python
Python中装饰器高级用法详解
2017/12/25 Python
flask-restful使用总结
2018/12/04 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
python基于Selenium的web自动化框架
2019/07/14 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
通过实例解析Python调用json模块
2019/12/11 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
python-地图可视化组件folium的操作
2020/12/14 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
公司年会演讲稿范文
2014/01/11 职场文书
家长给小学生的评语
2014/01/30 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
2014年计生标语
2014/06/23 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
详解Python函数print用法
2021/06/18 Python