^
- это битовый оператор XOR . Таким образом, он шифрует каждый символ по очереди поразрядно , XOR его со "случайным" символом. Эта операция является собственной обратной, то есть (a ^ b) ^ b == a
. Таким образом, до тех пор, пока вы генерируете ту же последовательность «случайных» символов маски во время дешифрования, что и во время шифрования, вы всегда будете возвращаться к тому, с чего начали.
Цикл $j
выглядит так, как будто он использует $key
для отбрасывания определенной части потока значений, генерируемых rand()
. Это выглядит как дешевый способ получить много разных случайных потоков из одного и того же ГСЧ. Я не уверен, что это очень безопасный метод. Домашние попытки шифрования обычно имеют чрезвычайно серьезные недостатки по сравнению с установленными методами, такими как AES.