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程序中的常见漏洞进行攻击
Oct 09 PHP
php5 mysql分页实例代码
Apr 10 PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
PHP统一页面编码避免乱码问题
Apr 09 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 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介绍篇
2010/10/26 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP如何实现跨域
2016/05/30 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
用vue写一个日历
2020/11/02 Javascript
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
浅谈Python中数据解析
2015/05/05 Python
python集合用法实例分析
2015/05/30 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
python实现大学人员管理系统
2019/10/25 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
金融专业推荐信
2013/11/14 职场文书
企业门卫岗位职责
2013/12/12 职场文书
中学生励志演讲稿
2014/04/26 职场文书
任命书格式
2014/06/05 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
公证处委托书
2015/01/28 职场文书
母亲去世追悼词
2015/06/23 职场文书
国富论读书笔记
2015/06/26 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android