Чего вы таким "алгоритмом" хотели добиться?
for ($i = 0; $i < 4096; $i++) {
$data[$i] = ($data[$i] ^ $data[0]);
}
На нулевом шаге $data[0] = $data[0] ^ $data[0] = 0;
Дальше все остальные элементы массива вы ксорите с нулём. И они не изменяются.
В расшифровке всё наоборот - нулевой элемент никак не восстановить.
Плюс я не знаю, как вы там в пхп итерируетесь. В джаве - по два байта.
Ну и каноничное: security throught obscurity - это плохо.