Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 19

Использование собственного класса в Windows Forms

15.12.2015, 15:26. Показов 1508. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу помочь мне с использованием собственного класса (последовательный алгоритм шифрования RSA) - представлен усеченный вариант, не влияющий, как я предполагаю, на проблему.
На сайте уже было несколько тем по этому поводу, но все же...
Я пользовалась вот этим ответом, но пока безрезультатно...(
Итак. У меня есть мой класс SerialRSA:

SerialRSA.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
public class SerialRSA
{
private: 
    const int MAX;
    char *Text;
    unsigned int e, d, n;
        void GenerateKey();
public:
    SerialRSA(char* _Text, int lenght);
    int getE() { return e; };
    int getD() { return d; };
    int getN() { return n; };
};
SerialRSA.cpp
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
SerialRSA::SerialRSA(char* _Text, int lenght):MAX(lenght)
{
    Text=_Text;
    GenerateKey();
}
void SerialRSA::GenerateKey()
{
    // Генерация ключей e, d, n.
}
Форма MyForm:
MyForm.h
C++
1
private: SerialRSA *serial; //error C2143: syntax error : missing ';' before '*'
MyForm.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "MyForm.h"
#include "SerialRSA.h"
 
char* SystemStringToChar(System::String^ string)
{
    return (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(string);
}
void CryptRSA::MyForm::btnCrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtCrypt->Text))
    {
        const int MAX = 20;
        String^ txt = txtCrypt->Text;
        int length = txt->Length;
        if (length <= MAX)
        {
            try
            {
                //Преобразование string в массив char
                char *Text = SystemStringToChar(txt);
                serial = new SerialRSA(Text, length); //error C2065: 'serial' : undeclared identifier
 
                //Вывод сгенерированных ключей
                txtOpenKey->Text = String::Format("{0}, {1}", serial->getE(), serial->getN()); //left of '->getN' must point to class/struct/union/generic type 
                txtCloseKey->Text = String::Format("{0}, {1}", serial->getD(), serial->getN());
            }
            catch (Exception ^ex)
            {
                MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
        }
        else
        {
            MessageBox::Show(String::Format("Длина текста для шифрования превышает максимально допустимый размер (%1 символов)", MAX), 
                "Алгоритм RSA", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для шифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
Что я делаю не так? Почему экземпляр serial не определяется?
Заранее благодарю за любую помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2015, 15:26
Ответы с готовыми решениями:

Использование собственного класса в Windows Forms
Здравствуйте, есть такая проблема, никак не могу понять как в Winwows Forms использовать свой класс. Есть у меня класс class.cpp, form1.h,...

Использование собственного класса в Виндовс Формс
Надо сделать программу на Windows Forms. По сути ето типа база данных транспортных средств должа быть, правда без использования баз данных...

Использование Boost в Windows Forms
Здравствуйте, возникла необходимость использовать библиотеки boost в windows forms. Скачал, подключил, в консоли работают. В формах...

2
Модератор
Эксперт С++
 Аватар для zss
13774 / 10967 / 6491
Регистрация: 18.12.2011
Сообщений: 29,248
15.12.2015, 15:44
C++
1
2
3
4
5
6
7
SerialRSA::SerialRSA(char* _Text, int lenght):MAX(lenght)
{
   Text=new char[lenght+1]; // Память ОБЯЗАТЕЛЬНО выделяем
   strcpy(Text,_Text);  // Данные ОБЯЗАТЕЛЬНО копируем
   GenerateKey();
}
SerialRSA::~SerialRSA(){delete[] Text;}// деструктор
Цитата Сообщение от Annushkash Посмотреть сообщение
private: SerialRSA *serial; //error C2143: syntax error : missing ';' before '*'
Удаляем это файл совсем.
А в MyForm.cpp добавляем
C++
1
SerialRSA *serial;
0
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 19
16.12.2015, 11:15  [ТС]
Спасибо, все заработало! Почистила класс, удалила ненужные массивы).

И еще можно вопрос не по теме:
облазила несколько форумов и многие из тех, кто решал задачу шифрования RSA сталкивались с проблемой кодирования-декодирования ANSII. Я пробовала решить проблему так, как там описано, но у меня не получается. В результате в txtbox выводится -20-32 (при шифровании "ма").

Вот код:
MyForm.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void CryptRSA::MyForm::btnCrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtCrypt->Text))
    {
        String^ txt = txtCrypt->Text;
        int length = txt->Length;
        if (length <= MAX)
        {
            try
            {
                //Преобразование string в массив char
                unsigned char *Text = SystemStringToChar(txt);
                serial = new SerialRSA();
 
                //Вывод сгенерированных ключей
                txtOpenKey->Text = String::Format("{0}, {1}", serial->getE(), serial->getN());
                txtCloseKey->Text = String::Format("{0}, {1}", serial->getD(), serial->getN());
 
                //Вывод зашифрованного текста
                unsigned int *cryptoCode = serial->Crypt(Text, length);
                                //Попытка удаления массива Text приводит к ошибке _BLOCK_TYPE_IS_VALID
                String^ outStr;
                for (int i = 0; i < length; i++)
                    outStr = String::Format(outStr+"{0} ", cryptoCode[i]);
                txtEncrypt->Text = outStr;
                stripLbl->Text="Текст зашифрован";
            }
            catch (Exception ^ex)
            {
                MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
        }
        else
        {
            MessageBox::Show(String::Format("Длина текста для шифрования превышает максимально допустимый размер ({0} символов)", MAX), 
                "Алгоритм RSA", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для шифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
 
void CryptRSA::MyForm::btnEncrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtEncrypt->Text))
    {
        try
        {
            String^ code = txtEncrypt->Text;
            int length = 0;
            unsigned int* arrayCode = StringToInt(" \n", code, length);
            
            char *Text = serial->Encrypt(arrayCode, length);
            String^ outStr;
            for (int i = 0; i < length; i++)
                outStr = String::Format(outStr+"{0}", Text[i]);
            txtCrypt->Text = outStr;
            stripLbl->Text="Текст дешифрован";
        }
        catch (Exception ^ex)
        {
            MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для дешифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
RSA.cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
unsigned int* SerialRSA::Crypt(unsigned char* Text, int lenght)
{
    //Массив для хранения шифротекста.
    unsigned int *CryptoText = new unsigned int [lenght];
 
    //Получение из введённых данных десятичного кода ASCII и
    //дальнейшее его преобразование по формуле ci = (mj^e)%n.
    int c;
    for (int j = 0; j < lenght; j++)
    {
        c = 1;
        unsigned int i = 0;
        int ASCIIcode = (static_cast<int>(Text[j]));
        while (i<e)
        {
            c = c*ASCIIcode;
            c = c%n;
            i++;
        }
        CryptoText[j] = c;
    }
    return CryptoText;
}
 
char* SerialRSA::Encrypt(unsigned int* Code, int lenght)
{
    //Массив для хранения шифротекста.
    char* Tdecrypt = new char[lenght];
 
    //Расшифровка полученного кода по формуле mi = (ci^d)%n и перевод его в десятичный код ASCII.
    int m;
    for (int j = 0; j < lenght; j++)
    {
        m = 1;
        unsigned int i = 0;
        while (i<d)
        {
            m = m*Code[j];
            m = m%n;
            i++;
        }
        Tdecrypt[j] = static_cast<char>(m);
    }
    return Tdecrypt;
}
И заодно: как я поняла, динамические массивы нужно удалять сразу после использования (к примеру, массив Text), а у меня ошибка почему-то...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2015, 11:15
Помогаю со студенческими работами здесь

Использование WinINet в Windows Forms
Возможно использовать WinInet в Windows Form или нет. Если возможно то пожалуйста подскажите как.

Использование string в Windows Forms Application
Я уже достаточно давно и вроде бы неплохо программирую на Turbo Delphi и решил перейти на Visual C++, но столкнулся с такими проблемами,...

Использование std::string в проектах Windows Forms
Вот кусок из кода с участием переменной string. Всё необходимое для работы с ней подключено: #include &lt;iostream&gt; #include...

Чтение переменных класса из файла в Windows Forms
Здравствуйте. Столкнулся с такой проблемой. Пользователь в моей программе должен выбрать файл, из которого будет произведено чтение...

Array из собственного класса
Здравствуйте. Описал классы нота и массив нот: #pragma once #include &lt;stdlib.h&gt; using namespace System; ref class Note { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru