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 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
php foreach、while性能比较
Oct 15 PHP
php 运行效率总结(提示程序速度)
Nov 26 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
PHP采集静态页面并把页面css,img,js保存的方法
Dec 23 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
php结合curl实现多线程抓取
Jul 09 PHP
php session的锁和并发
Jan 22 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 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
推荐文章系统(一)
2006/10/09 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
php使用str_replace替换多维数组的实现方法分析
2017/06/15 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
Javascript数据结构与算法之列表详解
2015/03/12 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
判断JS对象是否拥有某属性的方法推荐
2016/05/12 Javascript
基于jQuery实现仿微博发布框字数提示
2016/07/27 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
python实现机器人行走效果
2018/01/29 Python
python实现关键词提取的示例讲解
2018/04/28 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
python仿抖音表白神器
2019/04/08 Python
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
Prototype如何更新局部页面
2013/03/03 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
计算机本科生自荐信
2013/10/15 职场文书
大学生社团活动总结
2014/04/26 职场文书
青年文明号口号
2014/06/17 职场文书
法学专业求职信
2014/07/15 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
大学生逃课检讨书
2015/05/04 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
教师反邪教心得体会
2016/01/15 职场文书
CSS三大特性继承性、层叠性和优先级详解
2022/01/18 HTML / CSS