测试XXTea算法,网上没有一个php版本能还原小弟我的字符串,太奇葩了
程序员文章站
2022-05-08 12:49:33
...
测试XXTea算法,网上没有一个php版本能还原我的字符串,太奇葩了。
原文="你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@";
还原过的 =你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@;
只要遇到 \3,就不行。还有个别的\4,5,6,7,8,9,有的能还原,有的不能。
网上的所有php版本的XXTea算法基本都测试过,全是同样的问题,很奇怪。有高手吗指点一二?
原文="你是我的,sdfsdfsdfasd,error\4&:1234/?.,\3&%$#@@";
还原过的 =你是我的,sdfsdfsdfasd,error&:1234/?.,&%$#@@;
只要遇到 \3,就不行。还有个别的\4,5,6,7,8,9,有的能还原,有的不能。
网上的所有php版本的XXTea算法基本都测试过,全是同样的问题,很奇怪。有高手吗指点一二?
Class 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) if ($w) {
$m = $v[$len -1];
if (($m $n))
return false;
$n = $m;
}
$s = array ();
for ($i = 0; $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 $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) for ($i = count($k); $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 = self :: int32($sum + $delta);
$e = $sum >> 2 & 3;
for ($p = 0; $p $y = $v[$p +1];
$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y > 3 & 0x1fffffff) ^ $z $z = $v[$p] = self :: int32($v[$p] + $mx);
}
$y = $v[0];
$mx = self :: int32((($z >> 5 & 0x07ffffff) ^ $y > 3 & 0x1fffffff) ^ $z $z = $v[$n] = self :: int32($v[$n] + $mx);
}
return self :: long2str($v, false);相关文章
相关视频
上一篇: PHP自带函数给数字或字符串自动补齐位数
下一篇: php实现的CSS更新类实例