Home  >  Article  >  Backend Development  >  测试XXTea算法,网上没有一个php版本能还原我的字符串,太奇葩了。

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

WBOY
WBOYOriginal
2016-06-23 14:12:45905browse

Xxtea Xxtea算法

原文="你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@";
还原过的 =你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@;

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

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

<?phpClass Xxtea {	public function encrypt($s, $key) {		return self :: xxtea_encrypt($s, $key);	}	public function decrypt($e, $key) {		return self :: xxtea_decrypt($e, $key);	}	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]);		}		if ($w) {			return substr(join('', $s), 0, $n);		} else {			return join('', $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;	}	private function xxtea_encrypt($str, $key) {		if ($str == "") {			return "";		}		$v = self :: str2long($str, true);		$k = self :: 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 = self :: int32($sum + $delta);			$e = $sum >> 2 & 3;			for ($p = 0; $p < $n; $p++) {				$y = $v[$p +1];				$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ self :: int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));				$z = $v[$p] = self :: int32($v[$p] + $mx);			}			$y = $v[0];			$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ self :: int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));			$z = $v[$n] = self :: int32($v[$n] + $mx);		}		return self :: long2str($v, false);	}	private function xxtea_decrypt($str, $key) {		if ($str == "") {			return "";		}		$v = self :: str2long($str, false);		$k = self :: 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 = self :: int32($q * $delta);		while ($sum != 0) {			$e = $sum >> 2 & 3;			for ($p = $n; $p > 0; $p--) {				$z = $v[$p -1];				$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ self :: int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));				$y = $v[$p] = self :: int32($v[$p] - $mx);			}			$z = $v[$n];			$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ self :: int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));			$y = $v[0] = self :: int32($v[0] - $mx);			$sum = self :: int32($sum - $delta);		}		return self :: long2str($v, true);	}}//echo Xxtea::encrypt("你是我的,sdfsdfsdfasd,error:1234/?.,\3&%$#@@", "1234567890123456");$str = mb_convert_encoding("你是我的,sdfsdfsdfasd,error:1234/?.,\3&%$#@@", "UTF-8", "GB2312"); echo Xxtea::decrypt(Xxtea::encrypt($str, "1234567890123456"), "1234567890123456");?>



附一个php版本的xxtea算法代码,其他版本的也存在同样的问题。

回复讨论(解决方案)

是否被转义了?

本帖最后由 xuzuning 于 2013-06-11 09:38:43 编辑

不就是个平衡加密么?只要加密、解密后与原文相同不就是对了吗?
echo $s = "你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@", '<br>';echo $t = @Xxtea::decrypt(@xxtea::encrypt($s)), '<br>';var_dump($t == $s);echo '<p>';echo $s = '你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@', '<br>';echo $t = @Xxtea::decrypt(@xxtea::encrypt($s)), '<br>';var_dump($t == $s);

你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@
你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@
bool(true) 
你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@
你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@
bool(true) 

\4是特殊字符,显示不出来正常

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn