Требуется помощь в обеспечении сдвига текста. Количество пробелов в x преобразуется в буквы, а не в случайные символы.

Я работаю над страницей, посвященной криптографии, и решил включить Цезарь Шифр, метод, в котором вы сдвигаете букву «Х» на количество пробелов влево или вправо. Пример: шифрование буквы «А» с параметром сдвига 2. A => C.

Код ниже работает несколько прилично. Он способен шифровать / дешифровать вводимый мной текст, если он находится между определенными значениями ASCII.

Значения 65-90 в ASCII являются заглавными буквами, а 97-122 — строчными. Моя проблема в том, что если мой параметр сдвига настолько велик, что я превышаю эти интервалы.

Допустим, у меня есть буква «А», которую я хочу зашифровать с параметром сдвига 100. Если я попробую это сделать, буква «А» станет этим символом (http://www.theasciicode.com.ar/ascii-codes/spanish-enye-capital-letter-n-tilde-enie-uppercase-ascii-code-165.gif), который не отображается в моем браузере и превращается в странный знак вопроса.

У меня вопрос, каковы мои варианты, чтобы избежать этих странных символов? Можно ли сделать так, чтобы в него входили только буквы (прописные и строчные) и, возможно, цифры?

Я надеюсь, что вы можете мне помочь. Я буду в сети весь день, поэтому, если вам нужна дополнительная информация, просто спросите 🙂

Мое поле формы:

<form method="post">
<input type="text" name="textCaesarEncrypt" autocomplete="off" placeholder="Indtast tekst">
<input type="number" name="shiftCaesarEncrypt" autocomplete="off">
<label>Krypter</label>
<input type="radio" name="caesarEncryptOrDecrypt" value="caesarEncrypt">
<label>Dekrypter</label>
<input type="radio" name="caesarEncryptOrDecrypt" value="caesarDecrypt">
<input type="submit" name="submitCaesarEncrypt" value="Videre">

Мой PHP:

    <?php
$caesarEncryptOrDecrypt = $_POST ["caesarEncryptOrDecrypt"];

if (!empty($_POST['textCaesarEncrypt']) AND
!empty($_POST['shiftCaesarEncrypt'])){

$string = $_POST['textCaesarEncrypt'];
$shift = $_POST['shiftCaesarEncrypt'];
$shiftedString = "";if($caesarEncryptOrDecrypt == "caesarEncrypt") {
for ($i = 0; $i < strlen($string); $i++) {
$ascii = ord($string[$i]);
$shiftedChar = chr($ascii + $shift);

$shiftedString .= $shiftedChar;
}
echo $shiftedString;
}

if($caesarEncryptOrDecrypt == "caesarDecrypt") {
for ($i = 0; $i < strlen($string); $i++) {
$ascii = ord($string[$i]);
$shiftedChar = chr($ascii - $shift);

$shiftedString .= $shiftedChar;
}
echo $shiftedString;}

}
?>

0

Решение

Прежде всего, важно отметить, что Цезарь Cipher не рекомендуется, это слишком слабо, слабый, слабый, слишком слабый и довольно легко быть сломанным.

наверняка вы не хотите использовать систему шифрования, которая использовалась раньше, чем более 2000 лет

Юлий Цезарь: 13 июля 100 г. до н.э. — 15 марта 44 г. до н.э.)


Однако ключ здесь находится в следующей формуле — в случае шифрования -:

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

в то время как для расшифровки ваших зашифрованных данных вам нужно будет использовать следующую формулу:

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

где En (x) относится к зашифрованному символу, x = символ, n = значение сдвига;

источник изображений формул [википедия]


Однако эта формула очень хороша для людей, но не для компьютеров, у людей только 26 латинских символов, в то время как у компьютеров есть ASCII, который представлен 128, также нас не волнует регистр букв, поэтому Hello = heLLo для нас, в то время как это не то же самое с компьютерами, которые представляют как 97 и A как 65.

так что вам нужно будет преобразовать ваш ASCII в простой диапазон символов 1-26.

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

for ($i = 0, $n = strlen($string); $i < $n; $i++) {
$char = $string[$i];
// here we are checking the character type
// to set the range which will be used later
if (ctype_upper($char)) {
$range = 65;
} else if (ctype_lower($char)) {
$range = 97;
}
// convert the ascii indexed chars into alphabetic indexed chars
$ascii = ord($char) - $range;
// the caesar folrmula based on alphabetic indexed chars
$shiftedChar = chr((($ascii + $shift) % 26) + $range);
$shiftedString .= $shiftedChar;
}
echo $shiftedString;

Если вы хотите убедиться, что будут закодированы только буквенные символы, вы можете использовать ctype_alpha чтобы проверить это, он возвращает true, если символ является буквенным символом.

Также важно заметить, что при расшифровке Цезаря-шифра вам потребуется, как уже упоминалось, использовать следующую формулу:

$shiftedChar = chr((($ascii - $shift) % 26) + $range);
//                          ^ notice this

также изменить ваши диапазоны следующим образом:

if (ctype_upper($char)) {
$range = 90; // start with Z
} else if (ctype_lower($char)) {
$range = 122; // start with z
}

еще один замечательный полезный источник от CS50 , это учебник Cesar-Cipher C, но он имеет ту же концепцию.

1

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

Других решений пока нет …