Шифр Цезаря

sh3ll

Новичок
Всем привет, я новичок в php, и иногда пытаюсь писать некоторые программки. В этот раз выбрал шифр Цезаря ( это шифр, в котором каждый символ в тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите; например, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее). Прога должна была шифровать и дешифровать слова, но возникла проблемка при дешифрации. Например, если взять букву "А" и дешифровать со сдвигом в 1 шаг, т.е. должна появится буква "Z" - всплывает ошибка. Т.е. массив не просматривается заново, а останавливается на букве "А".
PHP:
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Шифр Цезаря</title>
        <link href="Style.css" rel="stylesheet">
    </head>
    <body>
        <div class="body">
            <div class="sa">
               <form action='fail6.php' method='POST'>
               <H1 align="center">Введите слово, для шифрования/дешифрования!</H1>
                    <div class="1" align="center">
                    <i>Сообщение может содержать только буквы английского алфавита*</i><br><br>
                    <input type='text' name='text' size=100>
                    <H1 align="center">Введите количество шагов, для сдвига!</H1>
                    <i>Доступны только числа в диапазоне от 1 до 25*</i><br><br>
                    <input type='number' name='number' min='1' max='25'><br><br>
                    <input type='Submit' value='Зашифровать' name='but'>
                    <input type='Submit' value='Расшифровать' name='but2'>
                    </div>
            </div>
         </div>
        </form>

    </body>
</html>
PHP:
<?php
if(isset($_POST['but']))
{      
    $name=$_POST['text'];
    $num=$_POST['number'];
 
    if(preg_match ('@[A-z]@u',$name) and preg_match ('/[0-9]/',$num))
         {
         
            $X=strtoupper($_POST['text']); //Преобразует строку в верхний регистр
            $alph=array('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');
            $N=count($alph);//Считает кол-во букв
            $b="";
            $n=strlen($X); //Возвращает длину строки
      
            for($i=0;$i<$n;$i++)
            for($j=0;$j<$N;$j++)
            {
            if($X[$i]==$alph[$j])
                {
                $b= $b . $alph[ ($j+$num) % $N];
                }
            }
      
            print "Зашифрованное слово:\t". $b ;
         }
    else {
            print "Не правильное слово для кодирования! ";
         }
}
if(isset($_POST['but2']))
{      
    $name=$_POST['text'];
    $num=$_POST['number'];
 
    if(preg_match ('@[A-z]@u',$name) and preg_match ('/[0-9]/',$num))
         {
         
            $X=strtoupper($_POST['text']); //Преобразует строку в верхний регистр
            $alph=array('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');
            $N=count($alph);//Считает кол-во букв
            $b="";
            $n=strlen($X); //Возвращает длину строки
      
            for($i=0;$i<$n;$i++)
            for($j=0;$j<$N;$j++)
            {
            if($X[$i]==$alph[$j])
                {
                $b= $b . $alph[ ($j-$num) % $N];
                }
            }
      
            print "Расшифрованное слово:\t". $b ;
         }
    else {
            print "Не правильное слово для кодирования! ";
         }
}
?>
 
Последнее редактирование модератором:

Hello

Новичок
Есть три варианта решения:
  1. Менять индекс, если он уходит за рамки алфавита.
  2. Сгенерировать второй массив, в котором будут соответствующии буквы, и использовать один для шифрации, другой для дешифрации
  3. Продублировать массив 2 раза
Рекомендую реализовать все 3 способа.
 

WMix

герр M:)ller
Партнер клуба
Например, если взять букву "А" и дешифровать со сдвигом в 1 шаг, т.е. должна появится буква "Z" - всплывает ошибка
PHP:
if($j-$num < 0)
  ($j-$num)+$N // по этому индексу
если я правильно понял

@sh3ll, яб изначально создавал бы алфавит типа
['A'=>'Z','B'=>'A',... ] а после по слову бегал

$alph=array('A','B','C','D..
повторяется, вырежи наверх
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Зачем делать массив, когда достаточно строки? Двух строк.
PHP:
<?php

$shift = 6;
$clean = "\0";
for($i = 1; $i < 256; $i++)
{
  $clean .= chr($i);
}

$encode = substr($clean, $shift) . substr($clean, 0, $shift);
$decode = substr($clean, -$shift) . substr($clean, 0, -$shift);
 

WMix

герр M:)ller
Партнер клуба
PHP:
  $count=(91-65);
  for($i = 0; $i < $count; $i++){
    $search[] = chr(65+$i);
    $replace[] = chr( 65+($i + $num + $count)%$count );
  }
  //echo replace($search, $replace, $str);
 
Последнее редактирование:
Сверху