Используется побитовый оператор ИЛИ
'1' = ASCII 0x31 = Binary 00110001
'z' = ASCII 0x7A = Binary 01111010
ИЛИ, получая два, дает
00110001 1
| 01111010 z
= 01111011 {
, что составляет 0x7B, что является символом ASCII {
И, как было указаночтобы сделать это обратимым, вместо X ИЛИ
следует использовать XOR, а XOR дает два значения
00110001 1
^ 01111010 z
= 01001011 K
, равное 0x4B, что является символом ASCII K
Реверс:
01001011 K
^ 01111010 z
= 00110001 1
РЕДАКТИРОВАТЬ
Это не особо сильный код, но:
$plainTextMessage = "My secret message";
$secretCharacter = 'z';
$codedMessage = '';
for($i = 0; $i < strlen($plainTextMessage); $i++) {
$codedMessage .= $plainTextMessage[$i] ^ $secretCharacter;
}
echo 'Coded Message is: '.$codedMessage.PHP_EOL;
$decodedMessage = '';
for($i = 0; $i < strlen($codedMessage); $i++) {
$decodedMessage .= $codedMessage[$i] ^ $secretCharacter;
}
echo 'Decoded Message is: '.$decodedMessage.PHP_EOL;