Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/41: Рейтинг темы: голосов - 41, средняя оценка - 4.63
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513

Написать дешифратор

22.10.2018, 17:22. Показов 9517. Ответов 151
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, можете помочь сделать проект, задача интересная: Дешифратор Виженера.
Вот начал с "модели данных" ,написал что программа должна делать:
Открыть (загрузить) зашифрованный текст
Сохранить отчет о дешифровке
Вывести время дешифровки
Выбор словаря ?!
Выбор алфавита(автоматический ?!)?!


Обрабатывать исключения

Найти длину ключа:
Разбить(сдвинуть) открытый текст на n столбцов
Вычислим автокорреляционные коэффициенты для сдвигов t = 1 , … , n , где n максимальная длина ключа
Вычислить индекс совпадений для сдвигов t = 1 , … , n ,
Найти ключ:
Двигать столбцы с определенным сдвигом, равным m, где m = алфавит - 1
Вычислить взаимные индексы совпадений для k -1 уже разбитых столбцов, где k длина ключа
Найти максимальные взаимные индексы совпадений для каждой из строк

В конечном итоге получаем алфавит - 1 вероятных ключей, но только один из них является настоящим.
Теперь нужно его определить не задействуя человека:

Первый вариант это словари, если в словаре ключа нет, ключ не осмысленный, то второй вариант вычислить корреляционную сумму.

?! - пока не знаю как это реализовать.

Получается из того, что я вам написал нужно выписать существительные - они потенциальные классы, потом нарисовать схему: обозначить связи наследование, агрегацию, в этом пока не понятно.
Выписал некоторые, вот что получилось:
Названия будут на английском , а пока что:

Контроль ошибок
Финальная расшифровка
Индекс совпаений
Взаимный индекс совпадений
Автокорреляция
ВыборАлфавита
СвигСтолбцов
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2018, 17:22
Ответы с готовыми решениями:

Цезарь (дешифратор)
Помогите исправить дешифратор цезаря using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Дешифратор Цезаря
Подскажите с дешифратором для Цезаря....заранее спасибо... char alphavit = { {'A', 'B', 'C', 'D',...

Шифратор/дешифратор
Всем привет! Помогите пожалуйста! Описываю задачу: Есть зашифрованный файл. Его текст примерно такой: А Б В ... 0 1 ... 9

151
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
25.10.2018, 18:23  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от V_Monomax Посмотреть сообщение
EncoderVigener
Давайте оставим, значит в проект с пространством имен Vigenere я добавил папку EncoderVigener в ней создал класс VigenerDecryptor

Добавлено через 3 минуты
Как то так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Vigenere.EncoderVigener
{
    class VigenerDecryptor
    {
    }
}
Добавлено через 36 минут
Может тогда DecoderVigener? Мы же все таки дешифруем
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 10:24
Цитата Сообщение от worldandlife Посмотреть сообщение
Может тогда DecoderVigener?
ну давайте.

Добавлено через 1 час 46 минут
создали?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 12:05  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
создали?
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Vigenere.DecoderVigener
{
    class VigenerDecryptor
    {
    }
}
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 12:13
worldandlife, так дак так. Хорошо, теперь нам надо создать в этом классе метод возвращающий булевое значение, при этом принимающий текст на входе и свойство расшифрованный текст. Справитесь?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 13:05  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
при этом принимающий текст на входе и свойство расшифрованный текст
Не понятно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private string decryptedText;
        public string DecryptedText
        {
            set
            {
                if (CheckDecrypt(value))
                   decryptedText = value;
            }
        }
        private bool CheckDecrypt(string text)
        {
            bool answer = false;
            return answer ;
        }
И все же я не понимаю по каким критериям программа будет определять, что текст расшифрован, ведь проделать операции расшифровки можно с любым текстом, но как вы поймете, что на выходе будет осмысленный текст?
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 13:30
Цитата Сообщение от worldandlife Посмотреть сообщение
И все же я не понимаю по каким критериям программа будет определять, что текст расшифрован, ведь проделать операции расшифровки можно с любым текстом, но как вы поймете, что на выходе будет осмысленный текст?
не торопитесь, я предлагал вам зайти с этой стороны, но вы сам еще не понимаете что нужно сделать, поэтому идем от большего к меньшему.
Цитата Сообщение от worldandlife Посмотреть сообщение
C#
1
2
private string decryptedText;
 public string DecryptedText { set { if (CheckDecrypt(value)) decryptedText = value; } }
в корне не верно, вы в любом случае выдаете текст, и только приватно его устанавливаете. Вернее это нужно так делать, поэтому попытайтесь еще.
Цитата Сообщение от worldandlife Посмотреть сообщение
private bool CheckDecrypt(string text)
{
bool answer = false;
return answer ;
}
Это хорошо, но только вызвав этот метод мы свойству DecryptedText - должны присвоить значение, справитесь?

Добавлено через 1 минуту
Цитата Сообщение от worldandlife Посмотреть сообщение
но как вы поймете, что на выходе будет осмысленный текст?
для этого есть метод дешифровки Кассики, и соответственно, словарь, и проверив, что слова есть в словаре, мы можем говорить об успешности прохождения дешифровки.
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 13:40  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
дешифровки Кассики
Он позволяет определить длину ключа, но не дешифровать текст, и потом в словаре есть минус, если ключ не осмысленный или(и) его нет в словаре то будут проблемы...

Добавлено через 2 минуты
Ну да ладно, как насчет автосвойства?
C#
1
public string DecryptedText{get; set;}
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 13:46
Цитата Сообщение от worldandlife Посмотреть сообщение
Он позволяет определить длину ключа, но не дешифровать текст, и потом в словаре есть минус, если ключ не осмысленный или(и) его нет в словаре то будут проблемы...
Зачем вы придумываете сложности? Да именно придумываете, пока не дошли до проблемы, о ней думать не стоит, пока только задача создать разметку ваших классов. По сути пойдем по пути решения проблем при не посредственном появлении проблемы. А пока
Цитата Сообщение от worldandlife Посмотреть сообщение
Он позволяет определить длину ключа, но не дешифровать текст, и потом в словаре есть минус, если ключ не осмысленный или(и) его нет в словаре то будут проблемы...
До этого далеко, нужно идти по на меченому пути, так как дорогу осилит идущий и волков бояться в лес не ходить!

Добавлено через 3 минуты
Цитата Сообщение от worldandlife Посмотреть сообщение
Ну да ладно, как насчет автосвойства?

C#
1
public string DecryptedText{get; set;}
про него и речь была
Цитата Сообщение от V_Monomax Посмотреть сообщение
вы в любом случае выдаете текст, и только приватно его устанавливаете.
правда вы читаете не внимательно то что вам даже уже разжевано, видимо летая в облаках, вам невдомек, что люди ходят по земле. Указанной цитатой из моего поста я хотел добиться следующего:

C#
1
public string DecryptedText{get; private set;}
это понятно? Почему private понятно?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 13:49  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
Почему private понятно?
Объясните же?
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 13:52
Цитата Сообщение от worldandlife Посмотреть сообщение
Объясните же?
еще разок, мы расшифровали текст, поняли что все хорошо, теперь нам надо отдать его тем кто просил. Для этого создано свойство. Однако, нам важно что-бы никто снаружи (относительно класса) не мог изменить этот текст (случайно или специально) поэтому мы установку свойства делаем private. Теперь понятно?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 13:54  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
Теперь понятно?
То есть инкапсулируем, а в классе оно будет доступно
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 14:10
Цитата Сообщение от worldandlife Посмотреть сообщение
То есть инкапсулируем
нет, у нас простое свойство, мы только разграничиваем доступ (по сути это поле readonly для внешних потребителей, а внутри класса оно может быть и прочитано и записано. В случае с инкапсуляцией мы должны ввести еще какую-нибудь проверку:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private string resText="Слишком короткий текст";
 
public string  Dtext
{
   get{return resText;}
   private set //может вообще быть с любым модификатором доступа protected, private и т.д.
{
                     if(value.Length<3)
                       {
                           resText="Слишком короткий текст";
                       }
                     else
                       {
                             resText=value;
                       }
}
}
Вот тогда у нас инкапсулируется проверка длины текста, по другому инкапсулируется валидирование текста.
Теперь понятно?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 14:20  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
Теперь понятно?
Я понял, давайте двигаться дальше
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 15:08
Цитата Сообщение от worldandlife Посмотреть сообщение
Я понял, давайте двигаться дальше
Хорошо. Теперь давайте думать о следующем этапе. Как думаете что нам нужно сделать?

Добавлено через 4 минуты
по скольку вас Кассики не устраивает предлагаю Фридмана, либо предложите ваши варианты.
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 15:24  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
либо предложите ваши варианты.
я собираюсь вычислить длину ключа автокорреляционным методом;
Индекс совпадений мне нужен только для отчета, а вот взаимный ИС понадобиться в дальнейшем

Добавлено через 1 минуту
Цитата Сообщение от V_Monomax Посмотреть сообщение
Как думаете что нам нужно сделать?
Мне кажется текст нужно обработать, оставить в нем символы, которые равны алфавиту

Тут напрашивается вопрос, либо программа вычисляет алфавит и задает его в переменную, либо мы даем возможность задать алфавит пользователю самому?

Фильтровал я текст так:
C#
1
2
3
4
5
6
7
8
9
  public string Filter(string str)
        {
            string s = "";
            for (int i = 0; i < str.Length; i++)
                for (int j = 0; j < alph.Length; j++)
                    if (str[i] == alph[j])
                        s = s + str[i];
            return s;
        }
Добавлено через 9 минут
Поиск длины ключа Автокорреляционный метод
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  public int Auto(string text)
        {
            int n = 0, lkey = 0;
            double y = 0;
            
            for (int t = 1; t < 25; t++)
            {
                for (int i = 0; i < (text.Length - t); i++)
 
                    if (text[i] == text[i + t])
                        n++;
                    y = n / (text.Length - t + 0.0);
                n = 0;
                if (y >= 0.05)
                {
                    lkey = t;
                    break;
                }
                
            }
             return lkey;
        }
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
26.10.2018, 15:33
Цитата Сообщение от worldandlife Посмотреть сообщение
собираюсь вычислить длину ключа автокорреляционным методом;
можно по подробнее?
Цитата Сообщение от worldandlife Посмотреть сообщение
Индекс совпадений мне нужен только для отчета, а вот взаимный ИС понадобиться в дальнейшем
Вы прям сами себе противоречите.
Цитата Сообщение от worldandlife Посмотреть сообщение
Мне кажется текст нужно обработать, оставить в нем символы, которые равны алфавиту
У нас код вижинера?
Цитата Сообщение от worldandlife Посмотреть сообщение
ут напрашивается вопрос, либо программа вычисляет алфавит и задает его в переменную, либо мы даем возможность задать алфавит пользователю самому?
Это чуть позже, я пока не вижу шага, который мы должны сделать, для того что-бы расшифровать текст.
Цитата Сообщение от worldandlife Посмотреть сообщение
C#
1
2
3
4
public string Filter(string str) 
{
   string s = ""; 
   for (int i = 0; i < str.Length; i++) for (int j = 0; j < alph.Length; j++) if (str[i] == alph[j]) s = s + str[i]; return s; }
вообще ни о чем.

Добавлено через 49 секунд
worldandlife, вы всегда код пишите без комментариев и документации?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
26.10.2018, 17:29  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
вы всегда код пишите без комментариев и документации?
Да, с комментами пишу, но редко, знаю что плохо
С документацией не знаком еще
Цитата Сообщение от V_Monomax Посмотреть сообщение
Вы прям сами себе противоречите.
В чем ? Длина ключа Автокорреляционный метод(он тоже пойдет в отчет), Индекс совпадений для отчета,
а вот Взаимный Индекс совпадений уже нужен для дальнейших вычислений(он тоже должен быть в отчете, для каждой пары с каждым сдвигом выйдет много)
Цитата Сообщение от V_Monomax Посмотреть сообщение
У нас код вижинера?
Именно, но пробелы и переносы строк могут помешать вычислениям, поэтому и фильтруем
чтобы остались только символы шифротекста
alph - это наш алфавит, который мы должны либо вычислить, либо задать самостоятельно;
C#
1
2
3
4
public string Filter(string str) 
{
   string s = ""; 
   for (int i = 0; i < str.Length; i++) for (int j = 0; j < alph.Length; j++) if (str[i] == alph[j]) s = s + str[i]; return s; }
Цитата Сообщение от V_Monomax Посмотреть сообщение
можно по подробнее?
Находим долю , согласно алгоритму, приведенному в статье, если она >= 0,5 то предполагаемый период(t) = длине ключа.
Или вам нужно описать алгоритм полностью?

Добавлено через 58 минут
Ну тогда я в ступоре, каков же следующий шаг на ваш взгляд?

Добавлено через 19 минут
Цитата Сообщение от V_Monomax Посмотреть сообщение
вообще ни о чем.
Что вы имели в виду? Что вам не понятно для чего это?

Добавлено через 27 минут
По поводу Касиски, я не против, я еще не использовал его, но знаю что он громоздкий и менее точный, чем Фридмана и Автокорреляционный. Можем попробовать написать его, тогда в программе будут фигурировать все три метода, так отчет будет более содержательным
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
27.10.2018, 16:44  [ТС]
Вот примерно такого я хочу добиться в идеале видео
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
29.10.2018, 10:10
Цитата Сообщение от worldandlife Посмотреть сообщение
Вот примерно такого я хочу добиться в идеале видео
возможности видеть видео на работе у меня нет (фаервол).
Цитата Сообщение от worldandlife Посмотреть сообщение
Находим долю , согласно алгоритму, приведенному в статье, если она >= 0,5 то предполагаемый период(t) = длине ключа.
Или вам нужно описать алгоритм полностью?
конечно полностью, вы думаете у меня есть время ковыряться в статьях? (Скажу по секрету: я сижу на работе, и пока происходят длительные операции, я пишу вам ответы, но операции сколь длительными они ни были, все же конечны, поэтому, старайтесь экономить мое время).
Цитата Сообщение от worldandlife Посмотреть сообщение
Что вы имели в виду? Что вам не понятно для чего это?
ваш код не понятен с первого взгляда == надо переписывать.
Цитата Сообщение от worldandlife Посмотреть сообщение
Ну тогда я в ступоре, каков же следующий шаг на ваш взгляд?
Если у нас все три метода Касиски, Фридмана и Автокорреляционный, то следует сначала вычленить у каждого метода то что их роднит. Как я предполагаю все три метода делают одну и ту же последовательность действий, но различными методами, поэтому надо эту последовательность вычленить, справитесь?
0
 Аватар для worldandlife
629 / 41 / 25
Регистрация: 25.04.2017
Сообщений: 513
29.10.2018, 11:22  [ТС]
Цитата Сообщение от V_Monomax Посмотреть сообщение
все три метода делают одну и ту же последовательность действий,
Они все работают по разному

Метод Касиски состоит в том, что в шифротексте осуществляется поиск одинаковых сегментов длин не меньше 3 и вычисляются расстояния между началами последовательных сегментов. Далее находится наибольший общий делитель (НОД) этих расстояний. Предполагаемый период является кратным этого делителя.

Автокорреляционный метод состоит в том, что исходный шифротекст выписывается в строку, а под ней выписываются строки полученные сдвигом вправо на t=1, 2, 3,... позиций. Для каждого t подсчитывается число https://www.cyberforum.ru/cgi-bin/latex.cgi?{n}_{t} индексов. Вычисляются автокорреляционные коэффициенты по формуле.(разбивать на столбцы не нужно)
Если по формуле у нас выходит значение >=0,05, то предполагаемый период = длине ключа
Метод индекса совпадений

Индекс совпадений
вычисляется по формуле для каждого столбца(я вам ранее писал что весь текст нужно разбить на столбцы, т. е если длина ключа предположительно = 5, то будет 5 столбцов, где 1 столбец это каждая 5 буква начиная с первой, второй столбец - каждая 5 буква начиная со второй и так до пяти.)
Для определения периода с помощью найденных ИС идет дикая формула, поэтому писать не буду. Достаточно предположения что найденный ИС > 0,0533, но опять же, я собираюсь вычислить ИС для уже найденного периода, чтобы он пошел в отчет.
Поэтому мы можем сначала написать Касиски, и использовать его для отчета;
Затем Автокорреляционный, чтобы найти длину ключа, которая уже будет фигурировать в расчетах
ИС для отчета;
Что скажете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2018, 11:22
Помогаю со студенческими работами здесь

Дешифратор Шифр Цезаря
Привет, делаю лабу, написал шифр цезаря вот код: Console.WriteLine(&quot;Введите слово,которое нужно зашифровать:&quot;); string...

Шифратор и дешифратор. Плагинная система.
Немогу понять как ето сделать:Программа для шифрования / дешифрования текста. Должна быть возможность шифровать различными способами ( все...

Шифратор/дешифратор с случайным ключем
Необходимо реализовать шифратор\дешифратор с рандомным ключем. Я его реализовал. Вот код: void codePhrase() //шифрую { ...

Нужен шифратор/дешифратор, который будет заменять буквы в тексте
Мне нужен год по которому программа будет заменять буквы в тексте. Например А на Б, Г на З и т.д. И сохранять в файл И по такому же...

Шифр Цезаря: Как сделать сортировку в шифре, чтобы дешифратор выдал единственно верное решение
Люди, как сделать сортировку в шифре, чтобы дешифратор выдал единственно верное решение Нужно как то по этой библиотеке прогнать... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru