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 cron中的批处理
Sep 16 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
php缓冲 output_buffering的使用详解
Jun 13 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
简单的php+mysql聊天室实现方法(附源码)
Jan 05 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
iOS10推送通知开发教程
Sep 19 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
laravel ORM 只开启created_at的几种方法总结
Jan 29 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 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 定义404页面的实现代码
2012/11/19 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
2012/06/20 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
JavaScript中的编码和解码函数
2017/02/15 Javascript
js匿名函数使用&amp;传参(实例)
2017/09/08 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
ES6 Array常用扩展的应用实例分析
2019/06/26 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
Python基于select实现的socket服务器
2016/04/13 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
Python 读取位于包中的数据文件
2020/08/07 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
2014年大学生四年规划书范文
2014/04/03 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
青年教师个人总结
2015/02/11 职场文书
工作收入证明模板
2015/06/12 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
CDPR谈《巫师》新作用虚幻5原因 称不会为Epic独占
2022/04/06 其他游戏