* @link http://www.coolcode.cn/?action=show&id=128 */ function int32(int $n): int { while ($n >= 2147483648) { $n -= 4294967296; } while ($n <= -2147483649) { $n += 4294967296; } return (int) $n; } /** * @param int[] $v */ function long2str(array $v, bool $w): string { $s = ''; foreach ($v as $val) { $s .= pack('V', $val); } if ($w) { return substr($s, 0, end($v)); } return $s; } /** * @return int[] */ function str2long(string $s, bool $w): array { $v = array_values(unpack('V*', str_pad($s, 4 * ceil(strlen($s) / 4), "\0"))); if ($w) { $v[] = strlen($s); } return $v; } function xxtea_mx(int $z, int $y, int $sum, int $k): int { return int32((($z >> 5 & 0x7FFFFFF) ^ $y << 2) + (($y >> 3 & 0x1FFFFFFF) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k ^ $z)); } /** Cipher * @param string $str plain-text password * @return string binary cipher */ function encrypt_string(string $str, string $key): string { if ($str == "") { return ""; } $key = array_values(unpack("V*", pack("H*", md5($key)))); $v = str2long($str, true); $n = count($v) - 1; $z = $v[$n]; $y = $v[0]; $q = floor(6 + 52 / ($n + 1)); $sum = 0; while ($q-- > 0) { $sum = int32($sum + 0x9E3779B9); $e = $sum >> 2 & 3; for ($p=0; $p < $n; $p++) { $y = $v[$p + 1]; $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]); $z = int32($v[$p] + $mx); $v[$p] = $z; } $y = $v[0]; $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]); $z = int32($v[$n] + $mx); $v[$n] = $z; } return long2str($v, false); } /** Decipher * @param string $str binary cipher * @return string|false plain-text password */ function decrypt_string(string $str, string $key) { if ($str == "") { return ""; } if (!$key) { return false; } $key = array_values(unpack("V*", pack("H*", md5($key)))); $v = str2long($str, false); $n = count($v) - 1; $z = $v[$n]; $y = $v[0]; $q = floor(6 + 52 / ($n + 1)); $sum = int32($q * 0x9E3779B9); while ($sum) { $e = $sum >> 2 & 3; for ($p=$n; $p > 0; $p--) { $z = $v[$p - 1]; $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]); $y = int32($v[$p] - $mx); $v[$p] = $y; } $z = $v[$n]; $mx = xxtea_mx($z, $y, $sum, $key[$p & 3 ^ $e]); $y = int32($v[0] - $mx); $v[0] = $y; $sum = int32($sum - 0x9E3779B9); } return long2str($v, true); }