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和ACCESS写聊天室(六)
Oct 09 PHP
PHP动态变静态原理
Nov 25 PHP
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
php 字符串函数收集
Mar 29 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
PHPEXCEL 使用小记
Jan 06 PHP
php中利用str_pad函数生成数字递增形式的产品编号
Sep 30 PHP
PHP小教程之实现双向链表
Jun 12 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
Dec 25 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 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
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
招聘网站基于jQuery实现自动刷新简历
2015/05/10 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
微信小程序 弹窗输入组件的实现解析
2019/08/12 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
Python通过select实现异步IO的方法
2015/06/04 Python
itchat接口使用示例
2017/10/23 Python
Django csrf 验证问题的实现
2018/10/09 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python中使用while循环的实例
2019/08/05 Python
python中Lambda表达式详解
2019/11/20 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
python爬虫基础知识点整理
2020/06/02 Python
基于PyTorch中view的用法说明
2021/03/03 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
实习单位推荐信范文
2013/11/27 职场文书
大学生个人求职信
2014/06/02 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
会计系毕业求职信
2014/08/07 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
正则表达式基础与常用验证表达式
2022/06/16 Javascript
CSS的calc函数用法小结
2022/06/25 HTML / CSS