>백엔드 개발 >PHP 튜토리얼 > 测试XXTea算法,网上没有一个php版本能还原小弟我的字符串,太奇葩了

测试XXTea算法,网上没有一个php版本能还原小弟我的字符串,太奇葩了

WBOY
WBOY원래의
2016-06-13 12:46:13916검색

测试XXTea算法,网上没有一个php版本能还原我的字符串,太奇葩了。
原文="你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@";
还原过的 =你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@;

只要遇到 \3,就不行。还有个别的\4,5,6,7,8,9,有的能还原,有的不能。

网上的所有php版本的XXTea算法基本都测试过,全是同样的问题,很奇怪。有高手吗指点一二?

<?php <br />
Class Xxtea {<br>
	public function encrypt($s, $key) {<br>
		return self :: xxtea_encrypt($s, $key);<br>
	}<br>
	public function decrypt($e, $key) {<br>
		return self :: xxtea_decrypt($e, $key);<br>
	}<br>
	private function long2str($v, $w) {<br>
		$len = count($v);<br>
		$n = ($len -1) 
		if ($w) {<br>
			$m = $v[$len -1];<br>
			if (($m  $n))<br>
				return false;<br>
			$n = $m;<br>
		}<br>
		$s = array ();<br>
		for ($i = 0; $i 
			$s[$i] = pack("V", $v[$i]);<br>
		}<br>
		if ($w) {<br>
			return substr(join('', $s), 0, $n);<br>
		} else {<br>
			return join('', $s);<br>
		}<br>
	}<br>
	private function str2long($s, $w) {<br>
		$v = unpack("V*", $s . str_repeat("\0", (4 - strlen($s) % 4) & 3));<br>
		$v = array_values($v);<br>
		if ($w) {<br>
			$v[count($v)] = strlen($s);<br>
		}<br>
		return $v;<br>
	}<br>
	private function int32($n) {<br>
		while ($n >= 2147483648)<br>
			$n -= 4294967296;<br>
		while ($n 
			$n += 4294967296;<br>
		return (int) $n;<br>
	}<br>
	private function xxtea_encrypt($str, $key) {<br>
		if ($str == "") {<br>
			return "";<br>
		}<br>
		$v = self :: str2long($str, true);<br>
		$k = self :: str2long($key, false);<br>
		if (count($k) 
			for ($i = count($k); $i 
				$k[$i] = 0;<br>
			}<br>
		}<br>
		$n = count($v) - 1;<br>
		$z = $v[$n];<br>
		$y = $v[0];<br>
		$delta = 0x9E3779B9;<br>
		$q = floor(6 + 52 / ($n +1));<br>
		$sum = 0;<br>
<br>
		while (0 
			$sum = self :: int32($sum + $delta);<br>
			$e = $sum >> 2 & 3;<br>
			for ($p = 0; $p 
				$y = $v[$p +1];<br>
				$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y > 3 & 0x1fffffff) ^ $z 
				$z = $v[$p] = self :: int32($v[$p] + $mx);<br>
			}<br>
			$y = $v[0];<br>
			$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y > 3 & 0x1fffffff) ^ $z 
			$z = $v[$n] = self :: int32($v[$n] + $mx);<br>
		}<br>
		return self :: long2str($v, false); <div class="clear">
                 
              
              
        
            </div>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.