шифрование — шифр сдвига на числах в переполнении стека

Я пишу комбинацию шифра vigenere и shift в php, где для символов он использует таблицу vigenere, а для чисел — длину предоставленного ключа. Его шифрование просто отлично, но когда я его дешифровываю, цифры приходят как ???? или 000, вот код для части цифр.

Кроме того, если длина ключа длинная, а число выходит за пределы 10, это просто даст мне значения типа «>» или «:»

$str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1555s";
$key = "aaa";

printf("Text: %s\n", $str);
echo "<br> </br>";
printf("key:  %s\n", $key);

$cod = encipher($str, $key, true);
$dec = encipher($cod, $key, false);

echo "<pre> Code:" . $cod .  "</pre>";
echo "<pre> Back:" . $dec .  "</pre>";
function encipher($src, $key, $encoder)
{
$key = strtoupper($key);
$src = strtoupper($src);
$dest = '';

/* strips out non-letters */
for($i = 0; $i <= strlen($src); $i++) {
$char = substr($src, $i, 1);
if(ctype_upper($char) or ctype_digit($char)) {
$dest .= $char;
}
}

for($i = 0; $i <= strlen($dest); $i++) {
$char = substr($dest, $i, 1);
if(ctype_digit($char)){
$dest = substr_replace($dest,
$encoder
? $char + strlen($key)
: $char - strlen($key)
, $i, 1);
}


if(!ctype_upper($char)) {
continue;
}
$dest = substr_replace($dest,
chr (
ord('A') +
($encoder
? ord($char) - ord('A') + ord($key[$i % strlen($key)]) - ord('A')
: ord($char) - ord($key[$i % strlen($key)]) + 26
) % 26
)
, $i, 1);
}

return $dest;
}

Итак, на выходе это

Код: LOREMIPSUMISSIMPLYDUMMYTEXTOFTHEPRINTINGANDTYPESETTINGINDUSTRYLOREMIPSUMHASBEENTHEINDUSTRYSSTANDARDDUMMYTEXTEVERSINCETHE4888S

Назад: LOREMIPSUMISSIMPLYDUMMYTEXTOFTHEPRINTINGANDTYPESETTINGINDUSTRYLOREMIPSUMHASBEENTHEINDUSTRYSSTANDARDDUMMYTEXTEVERSINCETHES

Но, это должно быть так

Код: LOREMIPSUMISSIMPLYDUMMYTEXTOFTHEPRINTINGANDTYPESETTINGINDUSTRYLOREMIPSUMHASBEENTHEINDUSTRYSSTANDARDDUMMYTEXTEVERSINCETHE4888S

Назад: LOREMIPSUMISSIMPLYDUMMYTEXTOFTHEPRINTINGANDTYPESETTINGINDUSTRYLOREMIPSUMHASBEENTHEINDUSTRYSSTANDARDDUMMYTEXTEVERSINCETHE1555S

РЕДАКТИРОВАТЬ:

Теперь он работает, я изменил код там, но, если длина ключа превратит число в 10, оно истечет

Неустранимая ошибка: превышено максимальное время выполнения 30 секунд

0

Решение

Я исправил это, просто создав круг от 0 до 9, просто выбрав последнее число строки, если его> = 10, и расшифровав, используйте это последнее число для массива, добавив его к 90, так что если число равно 5 , вспомогательная строка будет 95 и вычтет длину ключа, и просто возьмет последнюю цифру, поэтому 95-6 = 9.

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

Цикл шифрования / дешифрования цифр:

 for ($i = 0; $i <= strlen($dest); $i++) {
$char = substr($dest, $i, 1);
if (ctype_digit($char)) {
$aux = array(9,0);
$aux[1]=$char;
$dest = substr_replace($dest,
$encoder
? str_split($char + strlen($key))[(strlen($char + strlen($key))-1)]
: str_split(implode($aux)-strlen($key))[1]
, $i, 1);
}
1

Другие решения

Какова длина ключа в вашем примере?

Что вы видите, если вы выводите значение $ char, ord ($ char) и strlen ($ key) в этой точке кода?

(П.С. Это для академической задачи или теста на программирование? Это не для работы, не так ли?)

0