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 相关文章推荐
yii框架源码分析之创建controller代码
Jun 28 PHP
php生成excel列序号代码实例
Dec 24 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
php遍历解析xml字符串的方法
May 05 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
CI框架简单分页类用法示例
Jun 06 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
Smarty模板变量调节器用法分析
2016/05/23 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
2013/04/28 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
Bootstrap基础学习
2015/06/16 Javascript
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
2016/12/13 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
详解vue-cli 脚手架 安装
2019/04/16 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
js实现左右轮播图
2020/01/09 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
2019/05/29 Python
python操作kafka实践的示例代码
2019/06/19 Python
Python实现弹球小游戏
2020/08/01 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Html5 localStorage入门教程
2018/04/26 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
小学生我的梦想演讲稿
2014/08/21 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
2015年个人现实表现材料
2014/12/10 职场文书
500字小学生检讨书
2015/02/19 职场文书
学生保证书格式
2015/02/27 职场文书
计算机专业自荐信
2015/03/05 职场文书