Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2017, 18:32   #1
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
Сообщение Шифр Цезаря

Помогите правильно расшифровать текст на основе динамического ключа:
Код:
class Program
    {
        static int key(int pref, int index)
        {
            return (2 * pref) + index;
        }

        static void Main(string[] args)
        {
            String alphabet = "абвгдежзийклмнопрсттуфхцчшщьыъэюя";
            Console.WriteLine("Введите слово: ");
            String text = Console.ReadLine();
            text = text.ToLower();
            String result = "";
            int s = 0;
            Console.WriteLine("1 -> Зашифровать \n2 -> Расшифровать \n0 -> Выйти");
            int a = Convert.ToInt32(Console.ReadLine());
            switch(a)
            {
                case 1:
                    for(int i = 0; i < text.Length; i++)
                    {
                        for(int j = 0; j < alphabet.Length; j++)
                        {
                            if(text[i] == alphabet[j])
                            {
                                s = j;
                                break;
                            }
                        }
                        if(i == 0) result += text[i];
                        else
                        {
                            s = s + key(text[i - 1], i);
                            result += alphabet[s % alphabet.Length];
                        }
                    }
                    Console.WriteLine("Зашифрованное слово: " + result);
                    break;
                case 2:
                    for(int i = 0; i < text.Length; i++)
                    {
                        for(int j = 0; j < alphabet.Length; j++)
                        {
                            if(text[i] == alphabet[j])
                            {
                                s = j;
                                break;
                            }
                        }
                        if (i == 0) result += text[i];
                        else
                        {
                            s = s + key(text[i - 1], i) ;
                            result += alphabet[alphabet.Length - (s % alphabet.Length)];
                        }
                    }
                    Console.WriteLine("Расшифрованное слово: " + result);
                    break;
                case 0: 
                    Environment.Exit(0);
                    break;
            }
        }
    }

Последний раз редактировалось Ти6ка; 20.02.2017 в 18:35.
Ти6ка вне форума Ответить с цитированием
Старый 20.02.2017, 18:33   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И? Проблема-то в чем?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.02.2017, 18:35   #3
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Проблема в том, что зашифровать текст получается, а расшифровать его обратно нет
Ти6ка вне форума Ответить с цитированием
Старый 20.02.2017, 20:45   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Надо делать анализ кода:
распечатай в консоли соотношение "буква текста - ключ - шифробуква" (это для шифрования) и "шифробуква - ключ - буква текста" (для расшифровки). Например для шифрования:
Код:
Введите слово: тетрадь

т - 5 - ч
е - 2 - з
т - ......
р  - .....
а - .....
д - .....
ь - .....
Противоположно для расшифровки... Или у тебя ключ не цифра, а буква?...
Вообщем печатай дополнительную информацию - будем по ней анализировать как проходил процесс шифрования и расшифровки.

Кстате, а почему у тебя два раза "тт"?
.

Последний раз редактировалось ura_111; 20.02.2017 в 20:53.
ura_111 вне форума Ответить с цитированием
Старый 20.02.2017, 21:07   #5
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Шифрование(слово - тетрадь):
Первая буква не шифруется по условию.
е - 2186 - к
т - 2174 - ю
р - 2199 - ч
а - 2180 - д
д - 2153 - й
ь - 2184 - и
Зашифрованное слово: ткючдйи

Расшифрование:
к - 2191 - п
ю - 2196 - ф
ч - 2230 - ц
д - 2198 - ц
й - 2166 - ц
и - 2176 - а
Расшифрованное слово: тпфццца
Ти6ка вне форума Ответить с цитированием
Старый 20.02.2017, 22:33   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

У тебя ключ разный. Но ведь это симметричное шифрование, а значит ключ должен быть одним и тем же. Или нет? Или там сложение, а там должно быть вычитание ключа... Следующее предположение: может проблема в русских буквах... В любом случае надо пробывать ещё варианты:

1) Поменяй алфавит на английский. Попробуй "tet". Пиши что получилось.
___________________________________ _______________________

2) Пусть английский алфавит остаётся. Попробуй вернуть не такую сложную величину, а просто "i", т.е. вместо:
Код:
return (2 * pref) + index;
такое:
Код:
return index;
Пиши, что получилось.
___________________________________ _______________________

3) Сделай тоже самое что и в п.2, только:
Код:
return (2 * pref);
Пиши, что получилось.
___________________________________ _______________________

4) Сделай тоже самое что и в п.3, только:
Код:
return 0;
Пиши, что получилось.
___________________________________ _______________________

5) Сделай тоже самое что и в п.4, только:
Код:
return 1;
Пиши, что получилось.

Последний раз редактировалось ura_111; 20.02.2017 в 22:35.
ura_111 вне форума Ответить с цитированием
Старый 21.02.2017, 20:16   #7
Ти6ка
Пользователь
 
Регистрация: 22.04.2015
Сообщений: 24
По умолчанию

Вот что получилось, если при шифровании и расшифровании использовать только индексы символов в тексте:
Шифрование(тетрадь):
Первый символ по условию тот же.
е - 6 - ж
т - 21 - х
р - 21 - х
а - 7 - з
д - 13 - н
ь - 37 - е
Зашифрованное слово: тжххзне

Расшифрование(тжххзне):
Первый символ по условию тот же.
ж - 5 - е
х - 18 - т
х - 16 - р
з - 0 - а
н - 4 - д
е - 26 - ь
Расшифрованное слово: тетрадь

Код:
class Program
    {
        static int key(int pref, int index)
        {
            return pref + index;
        }

        static void Main(string[] args)
        {
            String alphabet = "абвгдежзийклмнопрстуфхцчшщьыъэюя";
            Console.WriteLine("Введите слово: ");
            String text = Console.ReadLine();
            text = text.ToLower();
            String result = "";
            int s = 0, k = 0;
            Console.WriteLine("1 -> Зашифровать \n2 -> Расшифровать \n0 -> Выйти");
            int a = Convert.ToInt32(Console.ReadLine());
            switch(a)
            {
                case 1:
                    for(int i = 0; i < text.Length; i++)
                    {
                        for(int j = 0; j < alphabet.Length; j++)
                        {
                            if(text[i] == alphabet[j])
                            {
                                s = j;
                                break;
                            }
                        }
                        if(i == 0) result += text[i];
                        else
                        {
                            s = s + key(i-1, i);
                            result += alphabet[s % alphabet.Length];
                            Console.WriteLine("{0} - {1} - {2}", text[i], s, result[i]);
                        }
                    }
                    Console.WriteLine("Зашифрованное слово: " + result);
                    break;
                case 2:
                    for(int i = 0; i < text.Length; i++)
                    {
                        for(int j = 0; j < alphabet.Length; j++)
                        {
                            if(text[i] == alphabet[j])
                            {
                                s = j;
                                break;
                            }
                        }
                        if (i == 0) result += text[i]; 
                        else
                        {
                            s = s - (key(i-1, i) % alphabet.Length);
                            if (s < 0) s = alphabet.Length + s;
                            result += alphabet[s];
                            Console.WriteLine("{0} - {1} - {2}", text[i], s, result[i]);
                        }
                    }
                    Console.WriteLine("Расшифрованное слово: " + result);
                    break;
                case 0: 
                    Environment.Exit(0);
                    break;
            }
        }
    }
Как теперь сделать ключ на основе кода символа?

Последний раз редактировалось Ти6ка; 21.02.2017 в 20:22.
Ти6ка вне форума Ответить с цитированием
Старый 21.02.2017, 22:19   #8
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вопросы:

1) Почему ты не делаешь мой предыдущий пост?.
В этом посте исследуется влияние двух параметров на формирование ключа, и как в следствии, зашифровку и расшифровку текста (дело в том, что я выбрал способ анализа: поочередно включать и выключать влияние каждого параметра; а также проверки уникода для английских букв)....
Твоя задача - примитивно перебрать все возможности (студенты должны перепахивать большие объёмы информации - вспомни написание, например, реферата), а моя задача - проанализировать этот поток данных и либо скорректировать тебя для дальнейшие исследования, либо понять как работает программа и её поправить...
Поверь, если бы я сам лично занимался этот проблемой, то выполнял бы те же самые действия о чём писал выше. Может быть это получилось бы быстрей (раз рука у меня, на институтские работы, уже набита), но мне хочется тебя привлечь к исследованиям: "Помни! Ты важен. Мы команда."

2) Что ты мне херню выводишь? (я имею ввиду колонку "ключ" шифрования)...
Рассмотрим шифрование 2-й буквы текста (можно сказать, это мой первый анализ твоих результатов):

100.jpg

Из рисунка понятно, что при ключе "6" открытый текст не может быть "ж"... Может быть мы по разному представляет себе шифр Цезаря? Или ты вывел мне не колонку "ключ", а что-то другое?
А ну, расскажи (в двух словах) о методе Цезаря, - тем самым мы синхронизируем наши представления о выбранном методе шифрования.

Последний раз редактировалось ura_111; 21.02.2017 в 22:38.
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр Цезаря KksMM C# (си шарп) 1 10.11.2016 10:04
Шифр цезаря noutiluss C# (си шарп) 0 17.03.2016 17:35
Шифр Цезаря Maserati Паскаль, Turbo Pascal, PascalABC.NET 16 31.03.2015 16:35
шифр Цезаря Defa4ka Помощь студентам 5 23.10.2011 13:48
Шифр Цезаря Jasper92 Помощь студентам 3 02.12.2009 18:47