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 smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
发一个php简单的伪原创程序,配合商城采集用的
Oct 12 PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
php上传图片存入数据库示例分享
Mar 11 PHP
PHP常用设计模式之委托设计模式
Feb 13 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
php实现的统计字数函数定义与使用示例
Jul 26 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
PHP rsa加密解密算法原理解析
Dec 09 PHP
php微信小程序解包过程实例详解
Mar 31 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正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
JavaScript canvas绘制折线图
2020/02/18 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python新手们容易犯的几个错误总结
2017/04/01 Python
Python面向对象基础入门之设置对象属性
2018/12/11 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Django框架获取form表单数据方式总结
2020/04/22 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
岗位职责范本
2013/11/23 职场文书
个人工作年终总结
2015/03/09 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
如何用python反转图片,视频
2021/04/24 Python
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js