Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для XaKO
23 / 23 / 30
Регистрация: 23.10.2012
Сообщений: 344

Как распараллелить код шифрования Гронсфельда?

29.10.2014, 13:17. Показов 1989. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это код шифра Гронсфельда, но при достаточно большом объеме текста шифрование занимает много времени. Если разделить текст на блоки по длине ключа и выполнять эти блоки в отдельных потоках(кстати, как узнать сколько лучше создать потоков для определенного количества блоков).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const string alpha = "\n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—&#152;™љ›њќћџ*ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
            private string Code(string text, string key)
            {
                int alphaLength = alpha.Length;
                int textLength = text.Length;
                int keytLength = key.Length;
                int i, NewC;
                string Result;
                try
                {
                    Result = "";
                    for (i = 0; i < textLength; i++)
                    {
                      //  Application.DoEvents();
                      //  progressBar1.Value = (i + 1) * 100 / textLength;
                        NewC = alpha.IndexOf(text[i]) + Convert.ToInt32(key[i % keytLength].ToString());
                        if (NewC >= alphaLength)
                            NewC -= alphaLength;
                        Result = Result + alpha[NewC];
                    };
                    return Result;
                }
                catch
                {
                    MessageBox.Show("Ошибка при шифровании.", "Ошибка!");
                    return text;
                }
            }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2014, 13:17
Ответы с готовыми решениями:

Алгоритм шифрования методом Гронсфельда
И снова доброго времени суток, уважаемые форумчане! Подскажите, как сделать, чтобы при шифровании каждый следующий символ шифровался...

Реализовать программу шифрования/дешифрования по алгоритму Гронсфельда
1/ Реализовать программу шифрования/дешифрования по алгоритму Гронсфельда 2/ Реализовать программу шифрования/дешифрования по алгоритму...

Шифр Гронсфельда - переписать код с C#
Есть код шифра гронсфельда на C# string GronsfeldEncipher(string toCode, string K) { for (int...

3
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
29.10.2014, 14:46
XaKO, Parallel.For?
1
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
29.10.2014, 15:05
Поскольку используется шифр Гронсфельда, шифрование последующих блоков текста никак не зависит от результата шифрования предыдущих блоков, следовательно разделение текста на блоки может быть весьма свободным. Целесообразным выглядит разделение текста на количество блоков, соответствующее количеству потоков.

Вопрос о количестве потоков уже совсем другой. На самом деле он весьма хитрый, и однозначного ответа быть не может. С первого взгляда может показаться, что чем больше потоков, тем выше производительность, но это совсем не так. У потоков есть такая характеристика, как переключение контекста, на которую расходуется процессорное время. Большое количество потоков не только не увеличит производительность,но может и катастрофическим образом понизить её.
Единственный верный способ узнать, какое количество потоков будет оптимальным - сделать замеры разнообразных вариантов. Неплохим началом в таком случае будет принцип "количество потоков = количество ядер", далее можно поиграть с вариантами. Однако стоит учесть ещё одну важную вещь. Основная выгода распараллеливания определённого процесса на потоки заключается в простом принципе: когда процессор ждёт завершения определённого процесса и свободен, почему бы ему не заняться чем-то другим? Однако если вычислительный процесс и без того сильно загружает процессор, добавление потоков не приведёт к повышению производительности, только снизит её.
Поэтому в любом случае необходимо делать замеры, результаты которых зависят от железа и от того, насколько данный код шифрования грузит процессор. Стоит также попробовать и Parallel.For, поскольку он автоматически определяет необходимое количество потоков своими хитрыми механизмами (которые тоже не всегда могут быть истиной в первой инстанции).

Насчёт конкретной реализации, вариантов также много. К примеру, Вы можете, определившись с количеством потоков, разделить входящий текст на равные блоки по количеству будущих потоков, каждый блок сохранить отдельно. Далее в основном потоке создать нужное количество потоков, в качестве аргумента передавать им нужный кусок текста. Поток зашифрует текст и вернёт его в нужное место, после отработки сигнализирует о завершении своей работы, например, с помощью ManualResetEvent. Основной поток всё это время будет ждать, пока все созданные потоки не выставят свои ManualResetEvent, после чего из кусков соберёт полный зашифрованный текст. Как-то так.
1
 Аватар для XaKO
23 / 23 / 30
Регистрация: 23.10.2012
Сообщений: 344
29.10.2014, 15:13  [ТС]
Cupko, Да, возможно, то что нужно. Только примеры там не очень понятны для новичка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2014, 15:13
Помогаю со студенческими работами здесь

Перевести код в Лазарус: шифр Гронсфельда
Нужно создать форму с полями, куда нужно вводить ключ ключ для шифровки. вот само условие задачи: Суть шифра Гронсфельда: Ключ шифра –...

Распараллелить код
Привет. есть код: // создаем 10 потоков static main(){ for(int i=0; i&lt;10; i++){ new thread(func1).start(); } ...

Распараллелить код, работающий с графами
Есть програма. В ней масив структур-вершины графа, у которых есть поля соседи, номер и цветовой код(от уля и вперед) Метод NumberOfCollors...

Как реализовать шифрование Гронсфельда
Шифр Гронсфельда является модификацией шифра Цезаря. Метод заключается в том, что каждый символ сообщения сдвигается на соответствующую...

Перевести код шифрования с Pascal на C#
Здравствуйте. Помогите пожалуйста перевести данный код с Pascal на c#. Заранее спасибо uses crt; type ttable=array of char; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru