Моноалфавитный заменитель Atbash для текста (строковое шифрование) - PullRequest
0 голосов
/ 25 марта 2019

У меня есть этот текст: abcdzwxy и я хочу зашифровать его методом Атбаша Поэтому я создаю массив, в котором есть все буквы, и для каждого я заменяю его Atbash. На иврите есть пример:

$text = 'abcdzwxy';
$letters2 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
$letters3 = ['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'];

$i = 0;
foreach($letters2 as $l) {
    $text = str_replace($l, $letters3[$i], $text);
    $i++;
}

echo $text;

результат его: abcdabcd вместо zwxyabcd - потому что при его замене a на z (массивом) в будущем необходимо заменить z на a - так что его почти «дублировать» строку .. и решение?

1 Ответ

1 голос
/ 25 марта 2019

Вы не можете использовать str_replace() здесь, потому что, как вы упомянули, он может заменять символы более одного раза, когда вы перебираете свой массив.Вместо этого вам следует перебирать символы вашей строки и подставлять каждый символ отдельно, по индексу.

for ($i = 0; $i < strlen($text); $i++) {
    $text[$i] = $letters3[array_search($text[$i], $letters2)];
}

Хотя вы можете использовать два массива для символов алфавита и подстановки, я думаю, что ассоциативный массив является более подходящимструктура для этой задачи.

$text = 'abcdzwxy';
$letters2 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
$letters3 = ['z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'];
$map = array_combine($letters2, $letters3);

for ($i = 0; $i < strlen($text); $i++) {
    $text[$i] = array_search($text[$i], $map);
}
echo $text;

Если строка содержит иврит или другие символы UTF-8, вы не можете перебрать ее, поскольку символ может содержать более одного байта.В этом случае вы можете использовать preg_split() для создания массива символов UTF-8.

$text = preg_split('//u', $text, null, PREG_SPLIT_NO_EMPTY);

(код взят из этого ответа )

Остальной код в основном такой же, но теперь $text - это массив, и он должен бытьпреобразован обратно в строку.

function str_to_array($str) {
    return preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
}

$text = "תשר";
$text = str_to_array($text);
$alphabet = str_to_array("אבגדהוזחטיךכלםמןנסעףפץצקרשת");
$map = array_combine($alphabet, array_reverse($alphabet));

for ($i = 0; $i < sizeof($text); $i++) {
    $char = array_search($text[$i], $map);
    if ($char) {
        $text[$i] = $char;
    }
}
$text = implode($text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...