За последние 24 часа нас посетили 59919 программистов и 1773 робота. Сейчас ищут 807 программистов ...

Шифр Цезаря-Помогите завершить програмку

Тема в разделе "PHP для новичков", создана пользователем alina_b, 26 фев 2009.

  1. alina_b

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

    С нами с:
    26 фев 2009
    Сообщения:
    5
    Симпатии:
    0
    Помогите завершить програмку с Шифром Цезаря.

    Написать функцию или что-то вроде, что нажав на кнопку crack, были показаны все возможные варианты от 1 до 26.


    Код (Text):
    1. <?php
    2.  
    3. if(isset($_POST['number'])) {
    4.    
    5.     if(ereg('^[A-Za-z]',$_POST['number'])) {
    6.     $erorcik = "Введите число .";
    7.         }
    8.        
    9.      
    10. } else {
    11.     $_POST['number'] = 5;
    12. }
    13.      
    14.  
    15. if(isset($_POST['code'])) {
    16.     $_POST['tekst'] = cezar($_POST['number'],$_POST['tekst']);
    17.  
    18. } elseif(isset($_POST['encode'])) {
    19.    
    20.     $_POST['tekst'] = cezar((26-$_POST['number']),$_POST['tekst']);
    21. }
    22.  
    23.  
    24.  
    25.  
    26.  else {
    27.     $_POST['tekst'] = '';
    28. }
    29. ?>
    30. <?php
    31.  
    32. function cezar($number,$insert) {
    33.    
    34.     $output = "";
    35.    
    36.    
    37.     $slovo = strlen($insert);
    38.    
    39.     for($i=0;$i<$slovo;$i++) {
    40.         $bukva = ord(substr($insert,$i));
    41.        
    42.         if($bukva > 64 && $bukva < 91) {
    43.             $bukva = $bukva - 65;
    44.             $bukva = ($bukva + $number)%26 + 65;
    45.            
    46.         } elseif ($bukva > 96 && $bukva < 123) {
    47.             $bukva = $bukva - 97;
    48.            
    49.             $bukva = ($bukva + $number)%26 + 97;
    50.         }
    51.        
    52.         elseif ($bukva >37  && $bukva < 64) {
    53.             $bukva = $bukva - 38;
    54.            
    55.             $bukva = ($bukva + $number)%26 + 38;
    56.         }
    57.        
    58.         $output .= chr($bukva);
    59.     }
    60.     return $output;
    61. }
    62. ?>
    63.  
    64. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    65. <html xmlns="http://www.w3.org/1999/xhtml">
    66. <head>
    67. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    68. <title>Шифр Цезаря</title>
    69. <style type="text/css">
    70. <!--
    71. .style3 {font-size: xx-large}
    72. -->
    73. </style>
    74. </head>
    75.  
    76. <body>
    77. <form action="<?$PHP_SELF?>" method="post" name="coding" id="coding">
    78.   <div>
    79.     <h1 align="center"> Шифр Цезаря</h1>
    80.     <div align="center"></div>
    81.     <h3 align="center">
    82.       <?php
    83.   if(isset($erorcik)) {
    84.     echo "<br />$erorcik<br /><br />\n";
    85.   }
    86. ?>
    87. Шаг кодирования
    88. <input type="number" name="number" value="<?=$_POST['number']?>" size="2" />
    89.     </h3>
    90.     <div align="center"><br />
    91.       <span class="style3">техт</span><br />
    92.       <textarea name="tekst" cols="60" rows="8" id="tekst"><?=$_POST['tekst'];?>
    93.       </textarea>
    94.       <br />
    95.       <input type="submit" name="code" value="code" />
    96.   &nbsp;&nbsp;
    97.       <input type="submit" name="encode" value="encode" />
    98.       &nbsp;&nbsp;
    99.      
    100.       <label></label>
    101.       <label>
    102.       <input type="submit" name="Crack" id="Crack" value="Crack" />
    103.       &nbsp;&nbsp;
    104.       </label>
    105.       <br />
    106.       </div>
    107.   </div>
    108. </form>
    109. </body>
    110. </html>
     
  2. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    почему бы тебе не прдставлять запись в виде массива. ключ - порядковый номер буквы. значение - текущие значение. потом 26 раз добавляем единцу(естественно по модулю 26), и выводим буквы соответствующие значению.
     
  3. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    и смени юпик. разрешены только личные фотографии.
     
  4. alina_b

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

    С нами с:
    26 фев 2009
    Сообщения:
    5
    Симпатии:
    0
    если всё было так просто..я за етим кодом 12 часов сидела....
     
  5. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2. <?
    3. function crack($insert) {
    4.  
    5.     $output = "";
    6.  
    7.  
    8.     $slovo = strlen($insert);
    9.     for($number=1; $number<27; $number++){
    10.         for($i=0;$i<$slovo;$i++) {
    11.              $bukva = ord(substr($insert,$i));
    12.  
    13.             if($bukva > 64 && $bukva < 91) {
    14.                 $bukva = $bukva - 65;
    15.                 $bukva = ($bukva + $number)%26 + 65;
    16.  
    17.             } elseif ($bukva > 96 && $bukva < 123) {
    18.                 $bukva = $bukva - 97;
    19.  
    20.                 $bukva = ($bukva + $number)%26 + 97;
    21.             }
    22.  
    23.             elseif ($bukva >37  && $bukva < 64) {
    24.                 $bukva = $bukva - 38;
    25.  
    26.                 $bukva = ($bukva + $number)%26 + 38;
    27.             }
    28.  
    29.             $output[$number] .= chr($bukva);
    30.         }
    31.     }
    32.     print_r($output);
    33.     return $output;
    34. }
    35. ?>
    36. ?>
    37.  
     
  6. alina_b

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

    С нами с:
    26 фев 2009
    Сообщения:
    5
    Симпатии:
    0
    о спасибо..попробуем..!!
     
  7. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    по хорошему надо, правда, брать первые 30-40 символов, и выводить возле каждой строки номер ключа, для того что бы потом раскодировать не перебирая все варианты текст любой длинны.
    Надеюсь вы отлично понимаете, что даже человек с таким шифром справится очень быстро? и практическая его ценность около нуля?=))
     
  8. alina_b

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

    С нами с:
    26 фев 2009
    Сообщения:
    5
    Симпатии:
    0
    как то не то.. закодировала GudGuy :) ,ключь -5 .( резултатат - LziLzd ),Ето с Crack -->
    Код (Text):
    1. Array ( [1] => MajMae [2] => NbkNbf [3] => OclOcg [4] => PdmPdh [5] => QenQei [6] => RfoRfj [7] => SgpSgk [8] => ThqThl [9] => UirUim [10] => VjsVjn [11] => WktWko [12] => XluXlp [13] => YmvYmq [14] => ZnwZnr [15] => AoxAos [16] => BpyBpt [17] => CqzCqu [18] => DraDrv [19] => EsbEsw [20] => FtcFtx [21] => GudGuy [22] => HveHvz [23] => IwfIwa [24] => JxgJxb [25] => KyhKyc [26] => LziLzd )
    ключь -21... :roll:
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    ключ - мужской род.
     
  10. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
  11. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Хозяина нет на месте. Работает грамматический бот.
     
  12. Из крекера спустя годика 3 получится отличный злобный модератор, типа меня )) Я к тому времени уже дорасту до уровня фаната, наверно )))
     
  13. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    эм... девушка, почему? не -21. а именно 21. При шифоровании мы работаем с МОДУЛЕМ(!) 26. ТОЛЬКО ПОЛОЖИТЕЛЬНЫЕ ЗНАЧЕНИЯ. т.е. если даже если юзвер за хочет работать с ОТРИЦАТЕЛЬНЫМ ключом, программа будет работать с ПОЛОЖИТЕЛЬНЫМ, потому что это МОДУЛЬ! рекомендуется сообщать об этом пользователям.
    Каким макаром вас в вообще криптографию занесло?
     
  14. alina_b

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

    С нами с:
    26 фев 2009
    Сообщения:
    5
    Симпатии:
    0
    задача такая в универе (кодировать,раскодировать..+bruteforce с всеми вариантами и ключами,даже отобрать ненужные варианти по буквам..) мне ета криптография ненужна..ето ознокомление по криптографии..

    ету функцию пробовала--тоже ключ показивает 21,хотя он 5....
    какая то закалдованая задача..
    Код (Text):
    1. function caesarbf($str) {
    2.       $alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    3.       echo "<table width="85%" cellpadding="2" align="center">\n";
    4.       for ($n = 1; $n < 26; $n++) {
    5.         $cipher = substr($alpha, $n, 26 - $n) . substr($alpha, 0, $n) . substr($alpha, 26+$n, 52-$n) . substr($alpha, 26, $n);
    6.         if ($n % 2 == 0) {
    7.           echo '<tr bgcolor="#eeeeee">';
    8.         } else {
    9.           echo '<tr bgcolor="#cccccc">';
    10.         }
    11.         echo "<td>ROT-$n: ". strtr($str, $alpha, $cipher) ."</td>";
    12.       }
    13.       echo "<tr>\n";
    14.       echo "</table>\n";
    15.     }
     
  15. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    всё правильно=) конечно=) это ключ ДЕКОДИРОВАНИЯ=)
    если вы хотите что бы вам написали ключ которым ЗАКОДИРОВАНО сообщение - вычтите полученный ключ кодировки из 26=)
    PHP:
    1.  
    2.  <?
    3.   function crack($insert) {
    4.  
    5.       $output = "";
    6.  
    7.  
    8.       $slovo = strlen($insert);
    9.         for($number=1; $number<27; $number++){
    10.           for($i=0;$i<$slovo;$i++) {
    11.                   $bukva = ord(substr($insert,$i));
    12.  
    13.               if($bukva > 64 && $bukva < 91) {
    14.                   $bukva = $bukva - 65;
    15.                       $bukva = ($bukva + $number)%26 + 65;
    16.  
    17.               } elseif ($bukva > 96 && $bukva < 123) {
    18.                   $bukva = $bukva - 97;
    19.  
    20.                   $bukva = ($bukva + $number)%26 + 97;
    21.               }
    22.  
    23.               elseif ($bukva >37  && $bukva < 64) {
    24.                   $bukva = $bukva - 38;
    25.  
    26.                   $bukva = ($bukva + $number)%26 + 38;
    27.               }
    28.               $key_code=26-$number;//ключь использованный при кодирование
    29.               $key_to_decod=$number;//если шифротекст закодировать этим ключом мы получим исходный текст
    30.               $output[$key_code] .= chr($bukva);
    31.           }
    32.       }
    33.       print_r($output);
    34.       return $output;
    35.   }
    36.   ?>
    37.   ?>
    38.  
    вот так должно быть правильно. А вообще, не расценивайте криптографию как язык. это математика! Хотя языковыми средствами то же можно шифровать информацию=) правда не думаю что вам это может понадобиться=))
    и помним - МОДУЛЬ 26=)