setKey($key); } function _encipher(&$Xl, &$Xr) { for ($i = 0; $i < 16; $i++) { $temp = $Xl ^ $this->_P[$i]; $Xl = ((($this->_S[0][($temp>>24) & 255] + $this->_S[1][($temp>>16) & 255]) ^ $this->_S[2][($temp>>8) & 255]) + $this->_S[3][$temp & 255]) ^ $Xr; $Xr = $temp; } $Xr = $Xl ^ $this->_P[16]; $Xl = $temp ^ $this->_P[17]; } function _decipher(&$Xl, &$Xr) { for ($i = 17; $i > 1; $i--) { $temp = $Xl ^ $this->_P[$i]; $Xl = ((($this->_S[0][($temp>>24) & 255] + $this->_S[1][($temp>>16) & 255]) ^ $this->_S[2][($temp>>8) & 255]) + $this->_S[3][$temp & 255]) ^ $Xr; $Xr = $temp; } $Xr = $Xl ^ $this->_P[1]; $Xl = $temp ^ $this->_P[0]; } function encrypt($plainText) { $cipherText = ''; $len = strlen($plainText); $plainText .= str_repeat(chr(0), (8 - ($len % 8)) % 8); for ($i = 0; $i < $len; $i += 8) { list(, $Xl, $Xr) = unpack('N2',substr($plainText, $i, 8)); $this->_encipher($Xl, $Xr); $cipherText .= pack('N2', $Xl, $Xr); } return $cipherText; } function decrypt($cipherText) { $plainText = ''; $len = strlen($cipherText); $cipherText .= str_repeat(chr(0), (8 - ($len % 8)) % 8); for ($i = 0; $i < $len; $i += 8) { list(, $Xl, $Xr) = unpack('N2', substr($cipherText, $i, 8)); $this->_decipher($Xl, $Xr); $plainText .= pack('N2', $Xl, $Xr); } return $plainText; } function setKey($key) { $len = strlen($key); $k = 0; $data = 0; $datal = 0; $datar = 0; for ($i = 0; $i < 18; $i++) { $data = 0; for ($j = 4; $j > 0; $j--) { $data = $data << 8 | ord($key{$k}); $k = ($k + 1) % $len; } $this->_P[$i] ^= $data; } for ($i = 0; $i <= 16; $i += 2) { $this->_encipher($datal, $datar); $this->_P[$i] = $datal; $this->_P[$i+1] = $datar; } for ($i = 0; $i < 256; $i += 2) { $this->_encipher($datal, $datar); $this->_S[0][$i] = $datal; $this->_S[0][$i+1] = $datar; } for ($i = 0; $i < 256; $i += 2) { $this->_encipher($datal, $datar); $this->_S[1][$i] = $datal; $this->_S[1][$i+1] = $datar; } for ($i = 0; $i < 256; $i += 2) { $this->_encipher($datal, $datar); $this->_S[2][$i] = $datal; $this->_S[2][$i+1] = $datar; } for ($i = 0; $i < 256; $i += 2) { $this->_encipher($datal, $datar); $this->_S[3][$i] = $datal; $this->_S[3][$i+1] = $datar; } } }