Шифр Цезаря (на php)

Реализация на php алгоритма шифра Цезаря (только сильно не смейтесь :) ).

C работой скрипта можно ознакомиться здесь.

Исходный код:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Криптография - шифр Цезаря</title>
</head>
<body>
<form method="post">
Исходный текст:<br />
<textarea rows="10" cols="40" name="text">это текст который нужно зашифровать шифр цезаря один из древнейших шифров при шифровании каждый символ заменяется другим отстоящим от него в алфавите на фиксированное число позиций шифр цезаря можно классифицировать как шифр подстановки при более узкой классификации шифр простой замены</textarea><br />
Смещение: <input type="text" value="3" name="shift" /><br />
<input type="submit" name="go" value="Шифровать!" />
</form>
<?php
if(isset($_POST['go'])){
 $text = $_POST['text'];
 $alphabet = array('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ь', 'ы', 'ъ', 'э', 'ю', 'я');
 for($i=0; $i<count($alphabet); $i++){
 $a = $i - $_POST['shift'];
 $tmp[$alphabet[$i]] = $i;
 if ($a<0) $a += count($alphabet);
 $alphabet_new[$a] = $alphabet[$i];
 }
 $alphabet = $tmp;

 // посчитаем частотность символов в исходном тексте
 $strlen = strlen($text);
 $letters = array();
 $letters2 = array();
 $letters3 = array();
 for($i=0; $i<$strlen; $i++){
 if(isset($letters[$text[$i]])){
 $letters[$text[$i]]++;
 }else{
 $letters[$text[$i]]=1;
 }

 // Шифруем
 if(in_array($text[$i], $alphabet_new)){
 $cryptogram .= $alphabet_new[$alphabet[$text[$i]]];
 // усовершествуем
 $sdvig =  ($i % (count($alphabet)));
 $sdvig += $alphabet[$text[$i]];
 if ($sdvig>count($alphabet)-1) $sdvig -= count($alphabet) - 1;
 $cryptogram2 .= $alphabet_new[$sdvig];
 }else{
 $cryptogram .= $text[$i];
 $cryptogram2 .= $text[$i];
 }

 }

 for($i=0; $i<$strlen; $i++){
 // считаем статистику для зашифрованного 1го и 2го
 if(isset($letters2[$cryptogram[$i]])){
 $letters2[$cryptogram[$i]]++;
 }else{
 $letters2[$cryptogram[$i]]=1;
 }

 if(isset($letters3[$cryptogram2[$i]])){
 $letters3[$cryptogram2[$i]]++;
 }else{
 $letters3[$cryptogram2[$i]]=1;
 }
 }

 // сортируем
 arsort($letters);
 $keys = array_keys($letters);
 arsort($letters2);
 $keys2 = array_keys($letters2);
 arsort($letters3);
 $keys3 = array_keys($letters3);
 echo '<table><tr><td>';

 echo '<br /><table>';
 echo '<tr><td>Символ</td><td>Частота</td><td>Проценты</td></tr>';
 for($i=0; $i<count($letters); $i++){
 $procent = $letters[$keys[$i]]*100/$strlen;
 $procent = substr($procent, 0, 4);
 echo '<tr><td>'.$keys[$i].'</td><td>'.$letters[$keys[$i]].'</td><td><img src="dot.gif" border="0" width="'.($procent*10).'" height="10">'.$procent.'%</td></tr>';
 }
 echo '</table>';

 echo '</td><td>';

 echo '<b>Обычный:</b><br /><table>';
 echo '<tr><td>Символ</td><td>Частота</td><td>Проценты</td></tr>';
 for($i=0; $i<count($letters2); $i++){
 $procent = $letters2[$keys2[$i]]*100/$strlen;
 $procent = substr($procent, 0, 4);
 echo '<tr><td>'.$keys2[$i].'</td><td>'.$letters2[$keys2[$i]].'</td><td><img src="dot.gif" border="0" width="'.($procent*10).'" height="10">'.$procent.'%</td></tr>';
 }
 echo '</table>';

 echo '</td><td>';

 echo '<b>Усовершенствованный:</b><br /><table>';
 echo '<tr><td>Символ</td><td>Частота</td><td>Проценты</td></tr>';
 for($i=0; $i<count($letters3); $i++){
 $procent = $letters3[$keys3[$i]]*100/$strlen;
 $procent = substr($procent, 0, 4);
 echo '<tr><td>'.$keys3[$i].'</td><td>'.$letters3[$keys3[$i]].'</td><td><img src="dot.gif" border="0" width="'.($procent*10).'" height="10">'.$procent.'%</td></tr>';
 }
 echo '</table>';

 echo '</td></tr></table>';
 echo '<b>Всего символов в тексте: '.$strlen.'</b><br />';

 // Шифруем
 echo '<b>Зашифрованный текст:</b><br /><textarea rows="10" cols="40">';
 echo $cryptogram;
 echo '</textarea>';

 echo '<br /><b>Зашифрованный улучшенно текст:</b><br /><textarea rows="10" cols="40">';
 echo $cryptogram2;
 echo '</textarea>';
}
?>
</body>
</html>

Это начало. Дальше будет немного посложнее и, надеюсь, поинтереснее и полезнее.

P.S. В скрипте используется картика  »dot.gif» — вместо нее можно взять любую однородную гифку, она будет использоваться для построения примитивных графиков.

UPD 23/03/2012
Сегодня заметил много переходов с контакта людей учащихся на АВТФ. Ребятки, мой вам совет, не пытайтесь подсунуть найденное здесь Минину :) Он вас сразу раскусит и лучше от этого точно не будет. Используйте как возможность понять принцип работы алгоритма.
И это, посоветуйте мой сайт http://ekl.mn/ своим друзьям и знакомым :) Вам он после универа тоже пригодиться!

This entry was posted in PHP and tagged , , , . Bookmark the permalink.

7 Responses to Шифр Цезаря (на php)

  1. LeniN says:

    Епт… Я о#?ел короче:)) Стока много букоф в коде :) ) Рассказывай в чем смысл шифровки ?:)

  2. Ух епт, там же все просто :) Берется исходный текст и каждый символ сдвигается на какое-то число. Например при сдвиге на 3 буква «а» станет буквой «г», «б» станет «д» и т.д.

  3. LeniN says:

    Ну вот теперь все понятно :) ) Я мельком глянул… Думаю еж ты мое… Сколько букаф много… Про сдвиг кста подумал… Оказалось верно :) Хех :) )

  4. Реализовывал такой на java в рамках лабораторной работы в Институте))

  5. Chukey says:

    вот мой вариант))) токо что написал

    $alphastr = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯ';
    $arr = array('А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ы','Э','Ю','Я',' ');
    
    function cryptCesar($crypttext = '', $_step = 1, $arrword = array()){
    	$arr = $arrword;
    	$i = 0;
    	while($i &lt; strlen($crypttext))
    	{
    		$word = $crypttext[$i];
    		$k = 0;
    		while($k = count($arr)) $step =$step - (count($arr));
    			if(strtolower($word) == strtolower($arr[$k])) {
    			if($word  == ' ') $str .= ' ';
    			if($word  == ',') $str .= ',';
    			if($word  == '.') $str .= '.';
    			else  $str .= $arr[$step];
    			break;
    			}
    			$k++;
    		}
    		$i++;
    	}
    	return strtolower($str);
    }
    
    function decryptCesar($crypttext = '', $_step = 1, $arrword = array())
    {
    	$arr = $arrword;
    	$i = 0;
    	while($i &lt; strlen($crypttext))
    	{
    		$word = $crypttext[$i];
    		$k = 0;
    		while($k = count($arr)) $step =$step- (count($arr));
    			if(strtolower($word) == strtolower($arr[$k])) {
    			if($word  == ' ') $str .= ' '; else $str .= $arr[$step];
    			break;
    			}
    			$k++;
    		}
    		$i++;
    	}
    
    	return strtolower($str);
    }
    
  6. vto says:

    поправь в примере, чтоб кодировку ставил, в мозиле руками приходится делать

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>