Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 20.10.2017
Сообщений: 40

Ошибка при расшифровки приватном ключом (RSA OpenSSL)

12.03.2022, 16:10. Показов 749. Ответов 0

Студворк — интернет-сервис помощи студентам
Есть примитивный клиент-сервер (чат)
Хотел сделать (в качестве обучения работы с openssl) чат в котором передача сообщение была зашифрована алгоритмом RSA

(Да я знаю что RSA не лучший вариант для чата т.к. он медленный и т.д. я его опять же делаю просто в качестве обучения)

Теперь к проблемы есть клиент сервер чат работает так. Клиент получает открытый ключ сервера. Этим ключом клиент шифрует свое сообщение и в зашифрованном виде передает это сообщение серверу. Сервер расшифровывает сообщение за счет своего закрытого ключа и уже расшифрованное сообщение и обратно отправляет его клиенту

Проблема именно с расшифровкой сообщение. Зашифровка открытом ключом проходит нормально но вот расшифровка уже выдает ошибку

На скриншоте (Слева консоль клиента, справа сервера) как видно по скрину сервер и клиент обменялись ключами. Далее я ввел сообщение qwe клиент вывел это сообщение в зашифрованном виде и в виде base64. И клиент отправил строку в base64 серверу
Как видно сервер получил это сообщение и удачно его декодировал с base64.

Но вот расшифровать он уже не смог и вывел ошибку (на скрине ошибку видно)

Я думал сначала может что-то лишнее приходит серверу от клиенту но длинна строки base64 и строки в зашифрованном виде у клиента и сервера была одинаковая



Вот часть кода сервера ( ошибка именно в функции private_decrypt, RSA_private_decrypt возвращает -1 )

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
    
    send(my_sock, "Hello, men\n", 12, 0);
 
    int bytes_recv = 0;
    std::string base64_message_decode;
    std::string base64_message_encode;
    std::string message_decode;
 
    int encrypted_length = RSA_size(str_p->public_key);
 
    int n = 0;
 
    while ((bytes_recv = recv(my_sock, recvbuf, 4098, 0)) && bytes_recv != SOCKET_ERROR)
    {
        base64_message_encode = recvbuf;
        std::cout << "----------------------------------" << std::endl;
        std::cout << "base64: " << base64_message_encode << std::endl;
        base64_message_decode = base64_decode(base64_message_encode);
        std::cout << "----------------------------------" << std::endl;
        std::cout << "Decode base64: " << base64_message_decode << std::endl;
        std::cout << "----------------------------------" << std::endl;
 
        strcpy((char*)encrypted, base64_message_decode.c_str());
 
                // ошибка именно в private_decrypt
        int decrypted_length = private_decrypt(encrypted, encrypted_length, (unsigned char*)str_p->private_key_char, decrypted);
        message_decode = convertToString((char*)decrypted);
 
        int n = message_decode.size();
 
        for (int i = 0; i < n; i++) {
            input[i] = message_decode[i];
        }
        input[n] = '\0';
        send(my_sock, input, strlen(input) + 1, 0);
    }
 
int private_decrypt(unsigned char* enc_data, int data_len, unsigned char* key, unsigned char* decrypted)
{
    RSA* rsa = createRSA(key, 0);
    int  result = RSA_private_decrypt(data_len, enc_data, decrypted, rsa, RSA_PKCS1_OAEP_PADDING);
    if (result == -1)
    {
        int err = ERR_get_error();
        char* err_c = NULL;
        std::cout << ERR_error_string(err, err_c) << std::endl;
    }
    return result;
}
 
std::string convertToString(char* a)
{
    std::string s = a;
    return s;
}
Вот часть кода клиента
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
    char recvbuf[4098];
    char input[4098];
    unsigned char  encrypted[4098] = {};
    unsigned char decrypted[4098] = {};
    int nsize = 0;
    int n = 0;
    std::string base64_message_encode;
    while ((nsize = recv(mysocket, recvbuf, 4098, 0)) != SOCKET_ERROR)
    {
        recvbuf[nsize] = '\0';
        std::cout << "S=>C: " << recvbuf << std::endl;
        std::cout << "S<=C: ";
        std::cin >> recvbuf;
 
        int encrypted_length = public_encrypt((unsigned char*)recvbuf, strlen(recvbuf), (unsigned char*)public_key_server_char, encrypted);
 
        base64_message_encode = base64_encode((char*)encrypted, strlen((char*)encrypted));
 
        std::cout << "----------------------------------" << std::endl;
        std::cout << "base64: " << base64_message_encode << std::endl;
        std::cout << "----------------------------------" << std::endl;
        std::cout << "Decode base64: " << encrypted << std::endl;
        std::cout << "----------------------------------" << std::endl;
        n = base64_message_encode.size();
 
        for (int i = 0; i < n; i++) {
            input[i] = base64_message_encode[i];
        }
 
        input[n] = '\0';
        send(mysocket, input, strlen(input) + 1, 0);
    }
Заранее спасибо за ответ
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2022, 16:10
Ответы с готовыми решениями:

Использование библиотеки openssl для шифровки и расшифровки сообщения по алгоритму Camellia
Здравствуйте, никак не могу разобраться с библиотекой openssl. Для начала надо зашифровать сообщение по алгоритму Camellia. Функции с таким...

Сложность расшифровки RSA и ECDSA
Пишу работу на тему криптосистем. Нужно сравнить криптосистему с RSA и ECDSA. Криптосистема построена на конечных автоматах. Открытый ключ-...

Реализация RSA в OpenSSL
В приложении на C++ нужно реализовать поддержку RSA, но поскольку на C++ у меня нет вообще никакого опыта, и перешел я на него по странной...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2022, 16:10
Помогаю со студенческими работами здесь

Написать программу для расшифровки текста зашифрованного методом Атбаш с ключом
Есть примерный текст программы Задание: Необходимо написать программу для расшифровки зашифрованного текста методом Атбаш с ключом ...

OpenSSL(RSA) не записывается ключ
Доброго времени суток! Начал разбираться с OpenSSL. Использую MS Visual studio 2008. Нашел пример использования.#include &lt;stdio.h&gt; ...

Расшифровка Rsa OAEP с sha256 openssl
Необходимо расшифровать информацию, которая приходит от сервера, которая зашифрована публичным ключом клиента и подписана приватным...

Шифрования (Расшифровка) строки (RSA OpenSSL C++)
Как зашифровать и расшифровать строку используя RSA в OpenSSL (C++)? Изучаю OpenSSL и стало интересно как зашифровать(расшифровать)...

OPENSsl RSA не расшифровывает зашифрованное сообщение
Всем привет. Уже несколько дней бьюсь над зашифровкой и расшифровкой текста через RSA шифрование. В интернете пытался найти в чем проблема,...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru