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 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
对于PHP 5.4 你必须要知道的
Aug 07 PHP
php 解压rar文件及zip文件的方法
May 05 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
php中chdir()函数用法实例
Nov 13 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
Yii使用migrate命令执行sql语句的方法
Mar 15 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
PHP实现的多维数组排序算法分析
Feb 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
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
php使用strtotime和date函数判断日期是否有效代码分享
2013/12/25 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
实例:用 JavaScript 来操作字符串(一些字符串函数)
2007/02/15 Javascript
javascript 避免闭包引发的问题
2009/03/17 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
Vue开发中整合axios的文件整理
2017/04/29 Javascript
Vue.directive 自定义指令的问题小结
2018/03/04 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
在Python中关于中文编码问题的处理建议
2015/04/08 Python
Python3里的super()和__class__使用介绍
2015/04/23 Python
python中list常用操作实例详解
2015/06/03 Python
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
Python异常处理知识点总结
2019/02/18 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
python实现两个文件夹的同步
2019/08/29 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
python 装饰器的基本使用
2021/01/13 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
支部鉴定材料
2014/06/02 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
奖励通知
2015/04/22 职场文书
公司人力资源管理制度
2015/08/05 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python