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 相关文章推荐
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
php 分页类 扩展代码
Jun 11 PHP
C# Assembly类访问程序集信息
Jun 13 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
Apr 08 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
MUI顶部选项卡的用法(tab-top-webview-main)详解
2017/10/08 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
[03:48]大碗DOTA
2019/07/25 DOTA
Python遍历指定文件及文件夹的方法
2015/05/09 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python 装饰器使用详解
2017/07/29 Python
从python读取sql的实例方法
2020/07/21 Python
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
打架检讨书2000字
2014/02/22 职场文书
承诺书样本
2014/08/30 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
导游词之岳阳楼
2019/09/25 职场文书
springcloud之Feign超时问题的解决
2021/06/24 Java/Android