Quantcast
Channel: Сообщество PHP DevelStudio - среда разработки программ
Viewing all articles
Browse latest Browse all 6336

Шифр Цезаря

$
0
0

Всем доброго времени суток! :)Знаю, что подобная тема уже когда-то создавалась, но там внятного ответа я так и не нашел. Скажу заранее, что в программистских делах я не сильно разбираюсь, - собственно поэтому и обратился на этот форум. С Php Devel Studio познакомился совсем недавно, и моими первыми проектами были несколько лабораторных работ по методам защиты информации. Затем я забросил эту тему, поняв, что это, все-таки, не совсем моё. Но через некоторое время я подумал, почему бы не попробовать сделать несколько программ, которые будут в той или иной мере осуществлять различные методы шифрования. Скажете, мол, таких сервисов пруд пруди , но согласитесь, что самому это сделать намного интереснее. Более того, я считаю, что для более полного понимания какой-либо деятельности необходимо изучить все её аспекты, в том числе и на программном уровне.
Итак, для самого начала я решил реализовать всем небезызвестный шифр Цезаря. Каков алгоритм шифрования, думаю, многие знают, - каждая буква в строке заменяется другой с определенным постоянным сдвигом. Для того, чтобы это реализовать я сделал следующее. Добавил одно окно edit1 как редактор текстового поля, в которое нужно вводить обычный текст, окно memo1 для вывода шифрованного сообщения и кнопку "Зашифровать" . Пока я не стал дополнять интерфейс программы полем для определения сдвига, - пусть он будет пока задан программно. Итак, на кнопку я повесил следующий код:
PHP код:

$text c("edit1")->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=strlen($text);

for (
$i=0$i<=$n;$i+=1)
{
for (
$j=0$j<=26$j+=1)
{
if (
$text[$i] == $alph[$j])
{

$text[$i]=$alph[(($j+4)%26)];

break;
}
}
}
c("memo1")->text $text

Сейчас объясню, - что , как зачем и почему. Сначала я должен создать массив из букв, которые я ввожу.
PHP код:

$text c("edit1")->text

На самом начальном этапе я планировал заменить каждую букву на соответствующую цифру:
PHP код:

$text str_replace ('a',1,$text); 

а затем к цифре прибавлять заданный шаг. А далее нужное число переводить обратно в буквы. Но так не вышло по двум причинам. Во-первых, и самое главное, вместо сложения 1+3=4 он выводил 13, несмотря на то, что цифру я не брал в кавычки , и она должна была стать integer, а не char. Во-вторых, при процессе дешифровки, каким образом он определит, что, допустим, 216 это вторая, первая и шестая буква, а не двадцать первая и шестая, или вторая и шестнадцатая. Знаю, что можно написать какое-нибудь крутое регулярное выражение, но так как первая причина все равно не устранена, переходить ко второй проблеме пока бессмысленно. В конце концов, я придумал другой способ, который, как мне кажется, лучше. Я ввел массив нужного алфавита. Пусть пока используются прописные буквы. Алгоритм, - я ввожу слово "дом". Программа берет первую букву "д" и начинает искать похожую в массиве алфавита. Как только она ее находит, мы сразу же определяем ее номер в алфавите, - 4 (счет идет от нуля). И далее мы заменяем букву "д" нашего слова на букву, которая отстоит от нашей, допустим, на четыре шага вперед. Складываем мы по модулю 26, так как в массиве алфавита всего 26 букв. Потом точно так же берем букву "о" и проделываем процедуру до конца. Казалось бы все просто, но программка шалит. Скорее всего, дело в циклах. Я, кстати, приписал, чтобы после нахождения буквы в алфавите, программа обрывала внутренний цикл (break) , но все так же. По какой-то причине, он не делит по модулю 26. То есть, при сдвиге, равным четырем, он кодирует все символы до буквы "v". Может, дело в версии программы, я использую 2.0, так как в ней поддерживаются скины, все-таки, хочется немного красоты:).
Сейчас я несколько хитрым способом решил данную проблему, - я удвоил массив исходного алфавита. Но вопрос остается открытым, - по каким причинам он не складывает по модулю? На всех php форумах пишут, что это выполняется знаком процента "%". Но у меня так не выходит(


Viewing all articles
Browse latest Browse all 6336

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>