Xxtea算法php,做个记号,XXTEA算法PHP版

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

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

{

$sum = $this->int32($sum+$delta);

$e = $sum>>2&3;

for($p=0;$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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值