Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline pasergey  
#1 Оставлено : 15 октября 2025 г. 19:14:33(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ

Всем привет!

Стоит задача, используя API КриптоПро CSP 5.0 на С++:
1. генерировать пару ключей
2. экспортировать публичный ключ для передачи клиенту
3. импортировать публичный ключ
4. шифровать файлы используя ключ клиента
5. расшифровывать файлы приватным ключом.

Прочёл кучу документации. Везде обрывочные данные о работе функций.
При этом есть список функций которые разрешены к использованию,
и многие примеры работы с API - используют НЕ разрешенные функции.

Помогите, плиз, с правильными последовательностями использования объектов и функции для решения задачи.

Отредактировано пользователем 15 октября 2025 г. 19:33:13(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 15 октября 2025 г. 20:43:03(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,957
Мужчина
Российская Федерация

Сказал «Спасибо»: 602 раз
Поблагодарили: 2341 раз в 1838 постах
Здравствуйте.

Начинали с CPDN?

Отредактировано пользователем 15 октября 2025 г. 20:53:35(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#3 Оставлено : 15 октября 2025 г. 20:44:25(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,957
Мужчина
Российская Федерация

Сказал «Спасибо»: 602 раз
Поблагодарили: 2341 раз в 1838 постах
Автор: pasergey Перейти к цитате

2. экспортировать публичный ключ для передачи клиенту
3. импортировать публичный ключ
4. шифровать файлы используя ключ клиента
5. расшифровывать файлы приватным ключом.


т.е. реально прям низкоуровневое?

Без сертификатов и высокоуровневых функций?
Техническую поддержку оказываем тут
Наша база знаний
Offline pasergey  
#4 Оставлено : 15 октября 2025 г. 21:43:24(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ

Автор: Андрей * Перейти к цитате
Здравствуйте.

Начинали с CPDN?


да. Цельной картины не сложилось. (
Offline pasergey  
#5 Оставлено : 15 октября 2025 г. 21:46:25(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ

Автор: Андрей * Перейти к цитате
Автор: pasergey Перейти к цитате

2. экспортировать публичный ключ для передачи клиенту
3. импортировать публичный ключ
4. шифровать файлы используя ключ клиента
5. расшифровывать файлы приватным ключом.


т.е. реально прям низкоуровневое?

Без сертификатов и высокоуровневых функций?



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

Буду рад помощи.
Offline Андрей *  
#6 Оставлено : 15 октября 2025 г. 23:39:14(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,957
Мужчина
Российская Федерация

Сказал «Спасибо»: 602 раз
Поблагодарили: 2341 раз в 1838 постах
Техническую поддержку оказываем тут
Наша база знаний
Offline pasergey  
#7 Оставлено : 16 октября 2025 г. 12:21:20(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ

Автор: Андрей * Перейти к цитате


Добрый день!
Спасибо за пример!

Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий.

каков порядок? у меня есть файл, его надо зашифровать/расшифровать.
1. получаем контекст криптопровайдера.
2. ищем сертификат в хранилище. сертификата нет. как его создать программно?

В общем туман.. ((
Offline Андрей *  
#8 Оставлено : 16 октября 2025 г. 14:57:20(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,957
Мужчина
Российская Федерация

Сказал «Спасибо»: 602 раз
Поблагодарили: 2341 раз в 1838 постах
Автор: pasergey Перейти к цитате
Автор: Андрей * Перейти к цитате


Добрый день!
Спасибо за пример!

Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий.

каков порядок? у меня есть файл, его надо зашифровать/расшифровать.
1. получаем контекст криптопровайдера.
2. ищем сертификат в хранилище. сертификата нет. как его создать программно?

В общем туман.. ((


какая-то самописная ИС будет?

Обычно за сертификатами обращаются в УЦ.

Для тестов можно делать на тестовом УЦ или генерировать самоподписанный.

Техническую поддержку оказываем тут
Наша база знаний
Offline pasergey  
#9 Оставлено : 16 октября 2025 г. 16:15:54(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ

Автор: Андрей * Перейти к цитате
Автор: pasergey Перейти к цитате

Добрый день!
Спасибо за пример!
Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий.
каков порядок? у меня есть файл, его надо зашифровать/расшифровать.
1. получаем контекст криптопровайдера.
2. ищем сертификат в хранилище. сертификата нет. как его создать программно?
В общем туман.. ((

какая-то самописная ИС будет?
Обычно за сертификатами обращаются в УЦ.
Для тестов можно делать на тестовом УЦ или генерировать самоподписанный.


Нет, это просто микро сервис для подписания, шифрования файлов.

Для того ,что бы генерировать самоподписанный - есть готовые инструменты?
Offline pasergey  
#10 Оставлено : 17 октября 2025 г. 9:55:00(UTC)
pasergey

Статус: Новичок

Группы: Участники
Зарегистрирован: 09.10.2025(UTC)
Сообщений: 8
Откуда: РФ



Вызов CryptEncryptMessage для определения размера выдает ошибку 87.
Не понятно, что не так..

провайдер: PROV_GOST_2012_512

сертификат самоподписанный
Код:
...Идентификатор ключа : fe1f2bf02c20951d33213459fb27b5858665008b
Алгоритм подписи    : sha256RSA
Алгоритм откр. кл.  : RSA (512 бит)
Открытый ключ       : 30 48 02 41 00 c5 d7 96 bc 27 7a 79 fb 9b 25 de 
                      15 1b 14 8e a2 d2 0a 6f 89 da 43 eb b3 7b da 90 
                      76 e3 44 61 41 a0 ce ec cf 7f b9 4c 69 25 c3 d3 
                      0b cd 36 86 d8 35 27 59 4f 2e 9f b7 81 3e f3 85 
                      0f fb 53 ff e3 02 03 01 00 01 
Выдан               : 16/10/2025  15:20:19 UTC
Истекает            : 16/10/2026  15:20:19 UTC
Ссылка на ключ      : Нет  
...



Код:
bool CryptoByContainer::encryptFile(const std::string& inputFile,
                                  const std::string& outputFile,
                                  const std::string& recipientCertPath) {
    if (!m_initialized) {
        m_lastError = "Crypto provider not initialized";
        return false;
    }

    // Загружаем сертификат получателя
    if (recipientCertPath!="" && !loadCertificateFromFile(recipientCertPath)) {
        return false;
    }else if(!findMyCertificate())
    {
        return false;
    }

    // Проверяем, что сертификат подходит для шифрования

    // HCRYPTKEY hPubKey = NULL;
    // if (!CryptImportPublicKeyInfo(m_hCryptProv,
    //                              MY_ENCODING_TYPE,
    //                              &m_pRecipientCert->pCertInfo->SubjectPublicKeyInfo,
    //                              &hPubKey))
    // {
    //     m_lastError = "Certificate cannot be used for encryption. Error: " + std::to_string(GetLastError());
    //     return false;
    // }
    // if (hPubKey) CryptDestroyKey(hPubKey);


    // Читаем данные файла
    std::ifstream file(inputFile, std::ios::binary);
    if (!file) {
        m_lastError = "Cannot open input file: " + inputFile;
        return false;
    }

    file.seekg(0, std::ios::end);
    size_t fileSize = file.tellg();
    file.seekg(0, std::ios::beg);

    std::vector<BYTE> fileData(fileSize);
    file.read(reinterpret_cast<char*>(fileData.data()), fileSize);
    file.close();

    // Создаем массив сертификатов получателей
    PCCERT_CONTEXT recipientCerts[] = { m_pRecipientCert };

    // Инициализируем параметры шифрования
    CRYPT_ENCRYPT_MESSAGE_PARA encryptParams = {0};
    encryptParams.cbSize = sizeof(encryptParams);
    encryptParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
    encryptParams.hCryptProv = m_hCryptProv;
    encryptParams.ContentEncryptionAlgorithm.pszObjId = szOID_CP_GOST_28147; //szOID_RSA_DES_EDE3_CBC; //szOID_CP_GOST_28147; // алгоритм шифрования


    // Первый вызов - получаем размер зашифрованных данных
    DWORD cbEncryptedBlob = 0;
    

    if (!CryptEncryptMessage(&encryptParams,
                            1,
                            recipientCerts,
                            fileData.data(),
                            static_cast<DWORD>(fileData.size()),
                            NULL,
                            &cbEncryptedBlob))
    {
        DWORD error = GetLastError();
        m_lastError = "Cannot determine encrypted message size. Error: " + std::to_string(error);
        return false;
    }

    // Выделяем память для зашифрованных данных
    std::vector<BYTE> encryptedData(cbEncryptedBlob);

    // Второй вызов - шифруем данные
    DWORD cbEncryptedData = cbEncryptedBlob;
    if (!CryptEncryptMessage(&encryptParams,
                            1,
                            recipientCerts,
                            fileData.data(),
                            static_cast<DWORD>(fileData.size()),
                            encryptedData.data(),
                            &cbEncryptedData))
    {
        DWORD error = GetLastError();
        m_lastError = "Encryption failed. Error: " + std::to_string(error);
        return false;
    }

    // Сохраняем зашифрованные данные
    std::ofstream outFile(outputFile, std::ios::binary);
    if (!outFile) {
        m_lastError = "Cannot create output file: " + outputFile;
        return false;
    }

    outFile.write(reinterpret_cast<char*>(encryptedData.data()), cbEncryptedData);
    outFile.close();

    return true;
}
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.