Как сделать шифрование простой заменой на PHP?

В образовательных целях делаю шифрование простой заменой на php.

const LETTERS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
const CODEMAP = "ЯВМЭУЫШТЬЖОЕЁНХСИЧЗЦПЩАЪКРЮЙЛБФГД";

function encrypt($string)
{
    return str_replace(
        mb_str_split(LETTERS),
        mb_str_split(CODEMAP),
        $string
    );
}

function decrypt($string)
{
    return str_replace(
        mb_str_split(CODEMAP),
        mb_str_split(LETTERS),
        $string,
    );
}

Но к сожалению не получается сделать декодирование строки:

$str = encrypt("ПРИВЕТ КАК ДЕЛА?");
echo $str; // "ИКЖАЛЙ ЕДЕ ПЛЁД?"
echo decrypt($str); // "УЧУХЫЪ ЧЯЧ УЫЫЯ?"

UPD: Использую кодировку utf-8, версия PHP 8.0


Ответы (1 шт):

Автор решения: KAGG Design

Вот рабочий код.

const LETTERS = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
const CODEMAP = "ЯВМЭУЫШТЬЖОЕЁНХСИЧЗЦПЩАЪКРЮЙЛБФГД";

$str = strtr( 'ПРИВЕТ КАК ДЕЛА?', LETTERS, CODEMAP );
echo $str . "\n";
echo strtr( $str, CODEMAP, LETTERS ) . "\n";

echo mb_internal_encoding() . "\n";

Вот результат выполнения.

введите сюда описание изображения

UPDATE

Вот код, который работает для любых символов.

const LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
const CODEMAP = 'mтЬJЁrФYQорЛДфмhсSТУXkWзqFVKхЖpХРНlЮyедiКnDбRСЩйЗeCgBxЕЙdЯЪПTOjкsжыvUaЧbEВfАGиБcчэNвAъёwщHацuгtЦЭОPШуZМЫzoлянLшИIMГюьп';

$letters_arr = mb_str_split( LETTERS );
$codemap_arr = mb_str_split( CODEMAP );

$str = strtr( 'ПРИВЕТ КАК ДЕЛА?', array_combine( $letters_arr, $codemap_arr ) );
echo $str . "\n";
echo strtr( $str, array_combine( $codemap_arr, $letters_arr ) ) . "\n";

Результат:

DбЮхХС еVе pХдV?
ПРИВЕТ КАК ДЕЛА?

Process finished with exit code 0
→ Ссылка