Помогите завершить програмку с Шифром Цезаря. Написать функцию или что-то вроде, что нажав на кнопку crack, были показаны все возможные варианты от 1 до 26. Код (Text): <?php if(isset($_POST['number'])) { if(ereg('^[A-Za-z]',$_POST['number'])) { $erorcik = "Введите число ."; } } else { $_POST['number'] = 5; } if(isset($_POST['code'])) { $_POST['tekst'] = cezar($_POST['number'],$_POST['tekst']); } elseif(isset($_POST['encode'])) { $_POST['tekst'] = cezar((26-$_POST['number']),$_POST['tekst']); } else { $_POST['tekst'] = ''; } ?> <?php function cezar($number,$insert) { $output = ""; $slovo = strlen($insert); for($i=0;$i<$slovo;$i++) { $bukva = ord(substr($insert,$i)); if($bukva > 64 && $bukva < 91) { $bukva = $bukva - 65; $bukva = ($bukva + $number)%26 + 65; } elseif ($bukva > 96 && $bukva < 123) { $bukva = $bukva - 97; $bukva = ($bukva + $number)%26 + 97; } elseif ($bukva >37 && $bukva < 64) { $bukva = $bukva - 38; $bukva = ($bukva + $number)%26 + 38; } $output .= chr($bukva); } return $output; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Шифр Цезаря</title> <style type="text/css"> <!-- .style3 {font-size: xx-large} --> </style> </head> <body> <form action="<?$PHP_SELF?>" method="post" name="coding" id="coding"> <div> <h1 align="center"> Шифр Цезаря</h1> <div align="center"></div> <h3 align="center"> <?php if(isset($erorcik)) { echo "<br />$erorcik<br /><br />\n"; } ?> Шаг кодирования <input type="number" name="number" value="<?=$_POST['number']?>" size="2" /> </h3> <div align="center"><br /> <span class="style3">техт</span><br /> <textarea name="tekst" cols="60" rows="8" id="tekst"><?=$_POST['tekst'];?> </textarea> <br /> <input type="submit" name="code" value="code" /> <input type="submit" name="encode" value="encode" /> <label></label> <label> <input type="submit" name="Crack" id="Crack" value="Crack" /> </label> <br /> </div> </div> </form> </body> </html>
почему бы тебе не прдставлять запись в виде массива. ключ - порядковый номер буквы. значение - текущие значение. потом 26 раз добавляем единцу(естественно по модулю 26), и выводим буквы соответствующие значению.
PHP: <? function crack($insert) { $output = ""; $slovo = strlen($insert); for($number=1; $number<27; $number++){ for($i=0;$i<$slovo;$i++) { $bukva = ord(substr($insert,$i)); if($bukva > 64 && $bukva < 91) { $bukva = $bukva - 65; $bukva = ($bukva + $number)%26 + 65; } elseif ($bukva > 96 && $bukva < 123) { $bukva = $bukva - 97; $bukva = ($bukva + $number)%26 + 97; } elseif ($bukva >37 && $bukva < 64) { $bukva = $bukva - 38; $bukva = ($bukva + $number)%26 + 38; } $output[$number] .= chr($bukva); } } print_r($output); return $output; } ?> ?>
по хорошему надо, правда, брать первые 30-40 символов, и выводить возле каждой строки номер ключа, для того что бы потом раскодировать не перебирая все варианты текст любой длинны. Надеюсь вы отлично понимаете, что даже человек с таким шифром справится очень быстро? и практическая его ценность около нуля?=))
как то не то.. закодировала GudGuy ,ключь -5 .( резултатат - LziLzd ),Ето с Crack --> Код (Text): 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:
Из крекера спустя годика 3 получится отличный злобный модератор, типа меня )) Я к тому времени уже дорасту до уровня фаната, наверно )))
эм... девушка, почему? не -21. а именно 21. При шифоровании мы работаем с МОДУЛЕМ(!) 26. ТОЛЬКО ПОЛОЖИТЕЛЬНЫЕ ЗНАЧЕНИЯ. т.е. если даже если юзвер за хочет работать с ОТРИЦАТЕЛЬНЫМ ключом, программа будет работать с ПОЛОЖИТЕЛЬНЫМ, потому что это МОДУЛЬ! рекомендуется сообщать об этом пользователям. Каким макаром вас в вообще криптографию занесло?
задача такая в универе (кодировать,раскодировать..+bruteforce с всеми вариантами и ключами,даже отобрать ненужные варианти по буквам..) мне ета криптография ненужна..ето ознокомление по криптографии.. ету функцию пробовала--тоже ключ показивает 21,хотя он 5.... какая то закалдованая задача.. Код (Text): function caesarbf($str) { $alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; echo "<table width="85%" cellpadding="2" align="center">\n"; for ($n = 1; $n < 26; $n++) { $cipher = substr($alpha, $n, 26 - $n) . substr($alpha, 0, $n) . substr($alpha, 26+$n, 52-$n) . substr($alpha, 26, $n); if ($n % 2 == 0) { echo '<tr bgcolor="#eeeeee">'; } else { echo '<tr bgcolor="#cccccc">'; } echo "<td>ROT-$n: ". strtr($str, $alpha, $cipher) ."</td>"; } echo "<tr>\n"; echo "</table>\n"; }
всё правильно=) конечно=) это ключ ДЕКОДИРОВАНИЯ=) если вы хотите что бы вам написали ключ которым ЗАКОДИРОВАНО сообщение - вычтите полученный ключ кодировки из 26=) PHP: <? function crack($insert) { $output = ""; $slovo = strlen($insert); for($number=1; $number<27; $number++){ for($i=0;$i<$slovo;$i++) { $bukva = ord(substr($insert,$i)); if($bukva > 64 && $bukva < 91) { $bukva = $bukva - 65; $bukva = ($bukva + $number)%26 + 65; } elseif ($bukva > 96 && $bukva < 123) { $bukva = $bukva - 97; $bukva = ($bukva + $number)%26 + 97; } elseif ($bukva >37 && $bukva < 64) { $bukva = $bukva - 38; $bukva = ($bukva + $number)%26 + 38; } $key_code=26-$number;//ключь использованный при кодирование $key_to_decod=$number;//если шифротекст закодировать этим ключом мы получим исходный текст $output[$key_code] .= chr($bukva); } } print_r($output); return $output; } ?> ?> вот так должно быть правильно. А вообще, не расценивайте криптографию как язык. это математика! Хотя языковыми средствами то же можно шифровать информацию=) правда не думаю что вам это может понадобиться=)) и помним - МОДУЛЬ 26=)