Импорт ключа
Добрый день. Я реализую шифрование сообщения при помощи открытого ключа получателя и закрытого отправителя.
Отправитель - сертификат с закрытым ключом сформированный через КриптоПро CSP
Получатель - сертификат с закрытым ключом. Закрытый ключ расположен на токене РутокенЭЦП
Алгоритм моих действий следующий:
1. Получаем из сертификата получателя BLOB открытого ключа следующим образом:
if(dwError==ERROR_SUCCESS)
{
//Импортируем открытый ключ
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();
}
2. Получаем закрытый ключ отправителя так:
if(dwError==ERROR_SUCCESS)
{
//Получаем закрытый ключ отправителя
if(!m_pcryptoAPI->CryptGetUserKey(AT_KEYEXCHANGE,&hSenderPrivateKey))
dwError=::GetLastError();
}
3. Импортируем открытый ключ получателя на закрытый отправителя
if(dwError==ERROR_SUCCESS)
{
//получаем ключ согласования импортом открытого ключа получателя на закрытый отправителя
if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey,NULL,&hAgreeKey))
{
}
else
dwError=::GetLastError();
}
На шаге №3 получаем ошибку 0x80090019 (-2146893799) набор ключей не определен
При этом, если в качестве получателя используется сертификат, закрытый ключ от которого расположен в реестре или на обычной флэшке (сформированный через КриптоПро), то все превосходно отрабатывает.
Вопрос в том, что не так.