Because of my code changed, now I have to use unpack, and with it I had to use floatval, so I just noticed until now, that I was using floats and I think the operands are not float compatible, I run php on 32 bit os. Probably that is the problem, using floats. I'm using a sample encrypted string of 8 characters long for easier testing.
Encrypted chars:
33,112,187,46,81,81,246,60
correctly decrypted chars:
30,0,140,13,152,152,0,100
my_xtea decrypted chars:
99,152,220,80,152,9,159,226
function my_xtea($s, $key) {
$delta = 0x9E3779B9; $sum = $delta * 32;
$v0 = floatval(unpack('N', substr($s, 0, 4))); $v1 = floatval(unpack('N', substr($s, 4, 4)));
for ($i = 0; $i < 32; $i++) {
$v1 = $v1 - (((($v0 << 4) ^ ($v0 >> 5)) + $v0) ^ ($sum + $key[($sum>>11) & 3]));
$sum = $sum - $delta;
$v0 = $v0 - (((($v1 << 4) ^ ($v1 >> 5)) + $v1) ^ ($sum + $key[$sum & 3]));
}
$ret = pack('N*', $v0, $v1);
return $ret;
}
$key = array(floatval('3027993532'), floatval('2715151340'), floatval('1391262992'), floatval('909125560'));
$tmp = my_xtea(chr(33).chr(112).chr(187).chr(46).chr(81).chr(81).chr(246).chr(60), $key);
echo ord($tmp[0]).','.ord($tmp[1]).','.ord($tmp[2]).','.ord($tmp[3]).','.ord($tmp[4]).','.ord($tmp[5]).','.ord($tmp[6]).','.ord($tmp[7]).'<br />';