За последние 24 часа нас посетили 15864 программиста и 1665 роботов. Сейчас ищет 901 программист ...

Помогите с решением задачи о шифровании/дешифровании

Тема в разделе "PHP для новичков", создана пользователем word, 8 апр 2011.

  1. word

    word Активный пользователь

    С нами с:
    8 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    Здравствуйте. Помогите пожалуйста. Задана следующая задача.
    Написать программу выполняющую шифрование и дешифрование слов.
    В шифре каждое слово шифруется отдельно. Рассмотрим шифрование на примере слов, состоящих только из строчных латинских букв.
    В начале, каждая буква заменяется соответствующим ей числом: a на 0, b на 1, c на 2, ..., z на 25. После этого к первому числу добавляется 5, ко второму числу добавляется первое число, к третьему - второе и т.д. После этого если какое-то число превосходит 25, то оно заменяется остатком от деления этого числа на 26. И, наконец, числа обратно заменяются буквами.
    Зашифруем слово SECRET:
    Шаг 0 S E C R E T
    Шаг 1 18 4 2 17 4 19
    Шаг 2 23 27 29 46 50 69
    Шаг 3 23 1 3 20 24 17
    Шаг 4 X B D U Y R
    В итоге получилось слово XBDUYR.

    Шифрование выполняется, а вот с дешифрованием проблемы. Не могу сообразить как.Вот код
    <?php

    if( isset($_REQUEST['string1']) && !empty($_REQUEST['string1']) )
    {
    $string1 = $_REQUEST['string1'];
    $word = strtok($string1, " ");
    while ($word)
    {
    echo "Введенное слово: $word <br />";
    echo "Зашифрованное слово: ";
    $len = strlen($word);
    $c1 = 5;
    $c2 = "";
    for ($i=0; ($i<$len); $i++):
    {
    $b = substr($word, $i, 1);
    $c1 = $c1 + (ord($b) - ord('A'));
    $c1 = $c1 % 26;
    $c2 = chr($c1 + ord('A'));
    echo $c2;
    }
    endfor;
    echo "<br />";
    $word = strtok(" ");
    }
    }
    else
    echo "Вы не ввели строку текста!";

    ?>

    <form action="/laba_0.php" method="post">

    <table border="1">
    <tr> Шифрование текста </tr>
    <tr>
    <td><label for="text">Введите строку текста, подлежащую шифрованию</label></td>
    <td><input name="string1" type="text" value=""/></td>
    </tr><br />
    <tr><td><button type="submit">ГОТОВО!</button></td></tr><br />
    </table>
    </form>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    во блин преподы злые мучают детей.
     
  3. word

    word Активный пользователь

    С нами с:
    8 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    да не говорите))) помочь сможете?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не, боюсь моск сломать. а так если тока за денежку то можно организовать.

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

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    word
    а что именно требуется логическое решение или именно рабочий код ?
     
  6. word

    word Активный пользователь

    С нами с:
    8 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    Чем поможете-тем и будем рады.
     
  7. NR55RU

    NR55RU Активный пользователь

    С нами с:
    16 фев 2011
    Сообщения:
    88
    Симпатии:
    0
    Щаг один
    Первое число
    Если меньше 5 значит число равно 26 + число
    Если больше или равно 5 то это и есть число
    23 = 23

    Второе число
    Если первое + второе число число больше 26 то делим сумму первого и второго на 26 отбрасываем дробь оставляем целое. если меньше присваиваем 1 (26 + 1) / 26 = 1
    26 умножаем на целое из пункта 1 и прибавляем само число
    26 х 1 + 1 = 27


    Остальные по аналогии

    Шаг второй
    А вот тут надо идти с конца
    Шестое число минус пятое
    69 – 50 = 19
    И так далее.
    Первое число тупо минус 5.

    Два главных аспекта это
    Первое число имеет четкие границы не даром там делалось +5 тобишь найти 1 число очень легко ибо если это а то на выходе оно будет 0+5 = 5 … тобишь все что меньше это остаток от деления но край это 30 25+5 .. и того 26 + 4

    Ну и второй момент это что второй шаг надо начинать с конца .

    Я уже уже засыпаю код писать мне не под силу и если вдруг что не очень понятно объяснил сорри.
    Но задача была интересная люблю помыслить.
     
  8. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    В переменную $word нужно поместить слово для шифрования
    Тогда в $sword будет результат шифрования, которое в свою очередь будет служить словом для дешифрования
    В $rword должен получиться результат дешифровки
    Если исходное слово и результат дешифровки не совпадают, то выводится ошибка. В алгоритме не уверен, так что нужно протестировать на разных словах
    PHP:
    1.  
    2. $word='ALABAMA';
    3. echo "<br>$word-to cipher<br>";
    4. $a[0 ]='A';
    5. $a[1 ]='B';
    6. $a[2 ]='C';
    7. $a[3 ]='D';
    8. $a[4 ]='E';
    9. $a[5 ]='F';
    10. $a[6 ]='G';
    11. $a[7 ]='H';
    12. $a[8 ]='I';
    13. $a[9 ]='J';
    14. $a[10]='K';
    15. $a[11]='L';
    16. $a[12]='M';
    17. $a[13]='N';
    18. $a[14]='O';
    19. $a[15]='P';
    20. $a[16]='Q';
    21. $a[17]='R';
    22. $a[18]='S';
    23. $a[19]='T';
    24. $a[20]='U';
    25. $a[21]='V';
    26. $a[22]='W';
    27. $a[23]='X';
    28. $a[24]='Y';
    29. $a[25]='Z';
    30.  
    31.  
    32. $b['A']=0 ;
    33. $b['B']=1 ;
    34. $b['C']=2 ;
    35. $b['D']=3 ;
    36. $b['E']=4 ;
    37. $b['F']=5 ;
    38. $b['G']=6 ;
    39. $b['H']=7 ;
    40. $b['I']=8 ;
    41. $b['J']=9 ;
    42. $b['K']=10;
    43. $b['L']=11;
    44. $b['M']=12;
    45. $b['N']=13;
    46. $b['O']=14;
    47. $b['P']=15;
    48. $b['Q']=16;
    49. $b['R']=17;
    50. $b['S']=18;
    51. $b['T']=19;
    52. $b['U']=20;
    53. $b['V']=21;
    54. $b['W']=22;
    55. $b['X']=23;
    56. $b['Y']=24;
    57. $b['Z']=25;
    58. ///процесс шифрования
    59. $n=strlen($word);
    60. $s=array();
    61. $s1=array();
    62. $s2=array();
    63. $sword='';
    64. for($i=0;$i<$n;$i++)
    65. {
    66.     $s[$i]=substr($word,$i,1);
    67.     $s1[$i]=$b[$s[$i]];
    68.     if($i==0)
    69.     {
    70.         $s2[$i]= $s1[$i]+5;
    71.  
    72.     }
    73.     else
    74.     {
    75.         $s2[$i]=$s2[$i-1]+$s1[$i];
    76.     }
    77.     $s3[$i]=$s2[$i]%26;
    78.     $s4[$i]=$a[$s3[$i]];
    79.    // echo $s4[$i];
    80.     $sword.=$s4[$i];
    81. }
    82. echo "<br>$sword-to decipher<br>";
    83. //процесс дешифрования
    84. $n=strlen($sword);
    85. $d=array();
    86. $d1=array();
    87. $d2=array();
    88. $d3=array();
    89. $rword='';
    90. for($i=0;$i<$n;$i++)
    91. {
    92.     $d[$i]=substr($sword,$i,1);
    93.     $d3[$i]=$b[$d[$i]];
    94.     if($i==0)
    95.     {
    96.         if(($d3[$i]-5)>=0)
    97.         {
    98.             $d2[$i]=$d3[$i];
    99.         }
    100.         else
    101.         {
    102.             $d2[$i]=$d3[$i]-5+26;
    103.         }
    104.         $d1[$i]=$d2[$i]-5 ;
    105.     }
    106.     else
    107.     {
    108.         $d2[$i]=$d3[$i];
    109.         while($d2[$i]<$d2[$i-1])
    110.         {
    111.             $d2[$i]=$d2[$i]+26;
    112.         }
    113.         $d1[$i]=$d2[$i]-$d2[$i-1];
    114.     }
    115.     $rword.=$a[$d1[$i]];
    116. }
    117. echo "<br>$rword-result word<br>";
    118. if($word!=$rword)
    119. {
    120.     echo "<br>error<br>";
    121. }
    122.  
     
  9. word

    word Активный пользователь

    С нами с:
    8 апр 2011
    Сообщения:
    5
    Симпатии:
    0
    Спасибо всем за помощь. Буду пробовать