Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Генерация ключа согласования для шифрования сессионного ключа
Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2015(UTC) Сообщений: 14 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Добрый день. Пытаюсь реализовать шифрование - расшифровку данных. Столкнулся со следующей проблемой: При использовании сертификата, ключевой контейнер которого установлен на носителе РутокенЭЦП получаю ошибку 0x80090019 Импортирую ключ так: Код:
if(m_pcryptoAPI->CryptImportPublicKeyInfoEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
&(pRecipientCert->pCertInfo->SubjectPublicKeyInfo),
0,
0,
NULL,
&hRecipientPublicKey))
{
//Экспортируем открытый ключ в BLOB
if(m_pcryptoAPI->CryptExportKey(hRecipientPublicKey,
NULL,PUBLICKEYBLOB,NULL,pbtPublicKeyBlob,&nPublicKeyBlobSize))
{
pbtPublicKeyBlob=new BYTE[nPublicKeyBlobSize];
if(pbtPublicKeyBlob==NULL)
dwError=E_OUTOFMEMORY;
else
{
if(!m_pcryptoAPI->CryptExportKey(hRecipientPublicKey,
NULL,PUBLICKEYBLOB,NULL,pbtPublicKeyBlob,&nPublicKeyBlobSize))
dwError=::GetLastError();
//Уничтожаем объект открытого ключа, т.к. в дальнейшем будем использовать только его BLOB
m_pcryptoAPI->CryptDestroyKey(hRecipientPublicKey);
hRecipientPublicKey=NULL;
}
}
else
dwError=::GetLastError();
}
else
dwError=::GetLastError();
if(dwError==ERROR_SUCCESS)
{
//получаем ключ согласования импортом открытого ключа получателя на закрытый отправителя
if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey,NULL,&hAgreeKey)) // собственно здесь я получаю ошибку
{
}
}
Сертификат который я мспользую в качестве сертификата получателя во вложении: EncryptRecipient.zip (2kb) загружен 5 раз(а).Вопрос в том - что не так с этим сертификатом. Или возможно у меня ошибка при получении блоба сертификата? Отредактировано пользователем 29 октября 2015 г. 15:17:05(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,334 Сказал «Спасибо»: 550 раз Поблагодарили: 2210 раз в 1725 постах
|
0x80090019 (-2146893799) набор ключей не определен КриптоПРО CSP\Сервис\Протестировать\По сертификату - указать сертификат получателя зашифрованных данных. результаты какие? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2015(UTC) Сообщений: 14 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Никаких. Потому как контейнера закрытого ключа для сертификата получателя нету в системе. Видимо я криво объяснил, прошу прощения. Я пытаюсь зашифровать сообщение парой ключей - закрытый ключ отправителя - открытый получателя. Закрытый ключ отправителя читается, он есть в системе, с ним все в порядке. В качестве открытого ключа получателя я подсовываю тестовый сертификат, закрытый ключ от которого расположен на носителе РутокенЭЦП (КриптоПро о нем ничего не знает) и получаю эту ошибку. Отредактировано пользователем 29 октября 2015 г. 14:48:38(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,334 Сказал «Спасибо»: 550 раз Поблагодарили: 2210 раз в 1725 постах
|
Что мешает сделать тестовый себе? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2015(UTC) Сообщений: 14 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей * Что мешает сделать тестовый себе? Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК. Проблемы начинаются когда подкладываю тот сертификат который необходим.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,334 Сказал «Спасибо»: 550 раз Поблагодарили: 2210 раз в 1725 постах
|
Автор: Svetovidov Автор: Андрей * Что мешает сделать тестовый себе? Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК. Проблемы начинаются когда подкладываю тот сертификат который необходим. Цитата: //получаем ключ согласования импортом открытого ключа отправителя на закрытый получателя if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey
Пример на зашифрование файла |
|
1 пользователь поблагодарил Андрей * за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2015(UTC) Сообщений: 14 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей * Автор: Svetovidov Автор: Андрей * Что мешает сделать тестовый себе? Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК. Проблемы начинаются когда подкладываю тот сертификат который необходим. Цитата: //получаем ключ согласования импортом открытого ключа отправителя на закрытый получателя if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey
Пример на зашифрование файла Да, виноват. Комментарий конечно неправильный. pbtPublicKeyBlob- Блоб открытого ключа получателя. hSenderPrivateKey - Дескриптор закрытого ключа отправителя. Собственно код процентов на 80% взят из вашего примера. Отредактировано пользователем 29 октября 2015 г. 15:20:57(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 08.10.2015(UTC) Сообщений: 14 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Собственно проблема была в том, что у ключей были разные параметры кривых. Поэтому чтобы не зависеть от этого решил использовать эфемерные ключи, которые генерируются с теми же параметрами кривых что и открытый ключ получателя. Код который делает это приведен ниже: Код:
if(m_pcryptoAPI->CryptGenKey(ephem_key_algid,CRYPT_EXPORTABLE|CRYPT_PREGEN,&hEphemKey))
{
BYTE* pboid;
DWORD dwOidLen;
//Получаем OID KP_DHOID открытого ключа
if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,106,NULL,&dwOidLen,NULL))
{
pboid=new BYTE[dwOidLen];
if(pboid)
{
if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,106,pboid,&dwOidLen,NULL))
{
//устанавливаем это значение вновь сгенерированному ключу
if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,106,pboid,NULL))
dwError=GetLastError();
}
else
dwError=GetLastError();
delete [] pboid;
}
else
dwError=E_OUTOFMEMORY;
}
else
dwError=GetLastError();
//Получаем значение OID KP_HASHOID открытого ключа
if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,103,NULL,&dwOidLen,NULL))
{
pboid=new BYTE[dwOidLen];
if(pboid)
{
if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,103,pboid,&dwOidLen,NULL))
{
//устанавливаем это значение вновь сгенерированному ключу
if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,103,pboid,NULL))
dwError=GetLastError();
}
else
dwError=GetLastError();
delete [] pboid;
}
else
dwError=E_OUTOFMEMORY;
}
else
dwError=GetLastError();
if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,14,NULL,0))
dwError=::GetLastError();
}
else
dwError=::GetLastError();
}
//Ну и далее импорт ключа и шифрование данных, согласно примерам
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Генерация ключа согласования для шифрования сессионного ключа
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close