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 相关文章推荐
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php判断linux下程序问题实例
Jul 09 PHP
PHP共享内存用法实例分析
Feb 12 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
php微信公众号开发之现金红包
Apr 16 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 PHP
PHP var关键字相关原理及使用实例解析
Jul 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中使用Session配合Javascript实现文件上传进度条功能
2014/10/15 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
Python选课系统开发程序
2016/09/02 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
Python中super函数的用法
2017/11/17 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
Pytorch Tensor的索引与切片例子
2019/08/18 Python
python3实现高效的端口扫描
2019/08/31 Python
pygame实现成语填空游戏
2019/10/29 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
CSS3动画animation实现云彩向左滚动
2014/05/09 HTML / CSS
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
医学类导师推荐信范文
2013/11/19 职场文书
集体婚礼证婚词
2014/01/13 职场文书
2014医学院领导干部四风对照检查材料思想汇报
2014/09/16 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers