Статус: Новичок
Группы: Участники
Зарегистрирован: 09.10.2025(UTC) Сообщений: 8 Откуда: РФ
|
Всем привет! Стоит задача, используя API КриптоПро CSP 5.0 на С++: 1. генерировать пару ключей 2. экспортировать публичный ключ для передачи клиенту 3. импортировать публичный ключ 4. шифровать файлы используя ключ клиента 5. расшифровывать файлы приватным ключом. Прочёл кучу документации. Везде обрывочные данные о работе функций. При этом есть список функций которые разрешены к использованию, и многие примеры работы с API - используют НЕ разрешенные функции. Помогите, плиз, с правильными последовательностями использования объектов и функции для решения задачи. Отредактировано пользователем 15 октября 2025 г. 19:33:13(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,957   Сказал «Спасибо»: 602 раз Поблагодарили: 2341 раз в 1838 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,957   Сказал «Спасибо»: 602 раз Поблагодарили: 2341 раз в 1838 постах
|
Автор: pasergey  2. экспортировать публичный ключ для передачи клиенту 3. импортировать публичный ключ 4. шифровать файлы используя ключ клиента 5. расшифровывать файлы приватным ключом. т.е. реально прям низкоуровневое? Без сертификатов и высокоуровневых функций? |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.10.2025(UTC) Сообщений: 8 Откуда: РФ
|
Автор: Андрей *  Здравствуйте. Начинали с CPDN? да. Цельной картины не сложилось. (
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.10.2025(UTC) Сообщений: 8 Откуда: РФ
|
Автор: Андрей *  Автор: pasergey  2. экспортировать публичный ключ для передачи клиенту 3. импортировать публичный ключ 4. шифровать файлы используя ключ клиента 5. расшифровывать файлы приватным ключом. т.е. реально прям низкоуровневое? Без сертификатов и высокоуровневых функций? Можно и сертификатами и высокоуровневыми функциями, но я не нашел стройного мануала, что бы понять необходимую последовательность вызовов функций для получения гарантированного результата. Буду рад помощи.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,957   Сказал «Спасибо»: 602 раз Поблагодарили: 2341 раз в 1838 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.10.2025(UTC) Сообщений: 8 Откуда: РФ
|
Автор: Андрей *  Добрый день! Спасибо за пример! Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий. каков порядок? у меня есть файл, его надо зашифровать/расшифровать. 1. получаем контекст криптопровайдера. 2. ищем сертификат в хранилище. сертификата нет. как его создать программно? В общем туман.. ((
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,957   Сказал «Спасибо»: 602 раз Поблагодарили: 2341 раз в 1838 постах
|
Автор: pasergey  Автор: Андрей *  Добрый день! Спасибо за пример! Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий. каков порядок? у меня есть файл, его надо зашифровать/расшифровать. 1. получаем контекст криптопровайдера. 2. ищем сертификат в хранилище. сертификата нет. как его создать программно? В общем туман.. (( какая-то самописная ИС будет? Обычно за сертификатами обращаются в УЦ. Для тестов можно делать на тестовом УЦ или генерировать самоподписанный. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 09.10.2025(UTC) Сообщений: 8 Откуда: РФ
|
Автор: Андрей *  Автор: pasergey  Автор: Андрей *  Добрый день! Спасибо за пример! Но для "чайника" в использовании криптографии: не понятен весь алгоритм действий. каков порядок? у меня есть файл, его надо зашифровать/расшифровать. 1. получаем контекст криптопровайдера. 2. ищем сертификат в хранилище. сертификата нет. как его создать программно? В общем туман.. (( какая-то самописная ИС будет? Обычно за сертификатами обращаются в УЦ. Для тестов можно делать на тестовом УЦ или генерировать самоподписанный. Нет, это просто микро сервис для подписания, шифрования файлов. Для того ,что бы генерировать самоподписанный - есть готовые инструменты?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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;
}
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close