Статус: Участник
Группы: Участники
Зарегистрирован: 22.01.2014(UTC) Сообщений: 16  Откуда: Сургут Сказал(а) «Спасибо»: 1 раз
|
Юрий, вы говорили, что примеров очень много на MSDN, я не могу найти примера шифрования файла через CryptMsgOpenToEncode, в PKCS#7, с вложением туда зашифрованных данных, сессионного ключа, вектора инициализации и сертификата (публичного) ключа получателя. Может есть ещё какой-то MSDN, о котором я не знаю, где есть пример с подобной операцией?
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 675   Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 95 раз в 68 постах
|
Автор: aleksey.gallyamov  Юрий, вы говорили, что примеров очень много на MSDN, я не могу найти примера шифрования файла через CryptMsgOpenToEncode, в PKCS#7, с вложением туда зашифрованных данных, сессионного ключа, вектора инициализации и сертификата (публичного) ключа получателя. Может есть ещё какой-то MSDN, о котором я не знаю, где есть пример с подобной операцией? Открою страшную тайну: есть ещё такой сервис как Google если уж на MSDN найти трудно. |
С уважением, Юрий Строжевский |
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 22.01.2014(UTC) Сообщений: 16  Откуда: Сургут Сказал(а) «Спасибо»: 1 раз
|
Автор: Юрий  Открою страшную тайну: есть ещё такой сервис как Google если уж на MSDN найти трудно. Такое ощущение, что информацией по этой теме намеренно не деляться, видимо страшная тайна. Ладно, большое спасибо за попытку помочь, буду дальше разбираться.
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 22.01.2014(UTC) Сообщений: 16  Откуда: Сургут Сказал(а) «Спасибо»: 1 раз
|
Код:
HCRYPTPROV hCryptProv = NULL;
if (!CryptAcquireContext(&hCryptProv, "SENDER", CP_GR3410_2001_PROV, PROV_GOST_2001_DH, 0))
{
SetError("CryptAcquireContext");
return false;
}
CMSG_ENVELOPED_ENCODE_INFO eInfo = { sizeof(eInfo) };
eInfo.hCryptProv = hCryptProv;
eInfo.ContentEncryptionAlgorithm.pszObjId = szOID_CP_GOST_28147;
eInfo.pvEncryptionAuxInfo = NULL;
// указатель на контекст сертификата
auto pCertContext = reinterpret_cast<PCCERT_CONTEXT>(recipientCertificate->Handle.ToPointer());
PCERT_INFO pCertInfo = pCertContext->pCertInfo;
eInfo.cRecipients = 1;
eInfo.rgpRecipients = &pCertInfo;
HCRYPTMSG hMsg = CryptMsgOpenToEncode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0, CMSG_ENVELOPED, &eInfo, NULL, NULL);
if (!hMsg)
{
SetError("CryptMsgOpenToEncode");
return false;
}
auto buffer = gcnew array<byte>(inputStream->Length);
inputStream->Read(buffer, 0, inputStream->Length);
pin_ptr<byte> pBuffer = &(buffer[0]);
if (!CryptMsgUpdate(hMsg, pBuffer, buffer->Length, true))
{
SetError("CryptMsgUpdate");
CryptMsgClose(hMsg);
return false;
}
DWORD cbData;
if (!CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, NULL, &cbData))
{
SetError("CryptMsgGetParam(CMSG_CONTENT_PARAM)'0");
CryptMsgClose(hMsg);
return false;
}
auto outputBuffer = gcnew array<byte>(cbData);
pin_ptr<byte> pbData = &(outputBuffer[0]);
if (!CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, pbData, &cbData))
{
SetError("CryptMsgGetParam(CMSG_CONTENT_PARAM)'1");
CryptMsgClose(hMsg);
return false;
}
outputStream->Write(outputBuffer, 0, outputBuffer->Length);
outputStream->Flush();
CryptMsgClose(hMsg);
Получаю зашифрованное сообщение, но закрытый ключ отправителя не используется, как в указанном примере, так как не появляется окно для ввода ПИН. Почему? Как сделать правильно?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
Цитата:Получаю зашифрованное сообщение, но закрытый ключ отправителя не используется, как в указанном примере, так как не появляется окно для ввода ПИН. Почему? Как сделать правильно? Потому что он не используется, т.к. не нужен... |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Юрий, вы говорили, что примеров очень много на MSDN, я не могу найти примера шифрования файла через CryptMsgOpenToEncode, в PKCS#7, с вложением туда зашифрованных данных, сессионного ключа, вектора инициализации и сертификата (публичного) ключа получателя. Может есть ещё какой-то MSDN, о котором я не знаю, где есть пример с подобной операцией? Вы, наверное, шутите про другой MSDN. CryptMsgOpenToEncode functionЦитата:Examples For examples that use this function, see Example C Program: Signing, Encoding, Decoding, and Verifying a Message, Alternate Code for Encoding an Enveloped Message, Example C Program: Encoding an Enveloped, Signed Message, and Example C Program: Encoding and Decoding a Hashed Message. |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 22.01.2014(UTC) Сообщений: 16  Откуда: Сургут Сказал(а) «Спасибо»: 1 раз
|
Автор: Kirill Sobolev  Вы, наверное, шутите про другой MSDN. Я искал возможность упаковать уже зашифрованные данные вместе с "обвязкой". В примерах на MSDN есть только упаковка с одновременным шифрованием, который ко всему прочему не шифрует сессионный ключ, ключём согласования с использованием открытого ключа получателя и ключа отправителя (только открытым ключём получателя). Ну да ладно, для начала и так сойдёт. И на MSDN вообще нет примеров использования CryptMsgOpenToDecode, хотя алгоритм и описания использования есть. Пока что именно провайдер Крипто Про 3.9 стабильно выдаёт ошибку при попытке декодировать/дешифровать: ASN.1 tag bad value. При чём не важно используется ли CryptMsgOpenToDecode или упрощённые функции.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,457  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 39 раз Поблагодарили: 750 раз в 645 постах
|
Сформировать сообщение вручную будет достаточно сложно и апи для этого не попадалось. Стандартов для pkcs7 с использованием ключа отправителя тоже не припомню, но вполне можно его использовать вместе эфемеральной пары, только зачем? Попробуйте все-таки шифрование в поточном режиме (-1) в качестве длины. |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,457  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 39 раз Поблагодарили: 750 раз в 645 постах
|
|
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close