15.04.2003 16:12:16Нет прав Ответов: 3
Куканов В.В.
Подскажите плз почему возникает ошибка.
На кнопке такой код:

HCRYPTPROV hProv; // CSP handle
HCRYPTKEY hSignKey; // Signature key pair handle
HCRYPTKEY hXchgKey; // Exchange key pair handle
HCRYPTKEY hKey; // Session key handle
BYTE *pbKeyBlob; // Pointer to a simple key blob
DWORD dwBlobLen; // The length of the key blob

CHAR * pszContainer="zaxs";
CHAR * pszProvider="Crypto-Pro Cryptographic Service Provider";
CString aqsw;// строка для выдачи сообщений об ошибках

CStdioFile ExportKey;
DWORD res;
// Получение дескриптора криптопровайдера
if(!CryptAcquireContext(
&hProv,
pszContainer,
pszProvider,
2,
CRYPT_NEWKEYSET))
{
aqsw.Format("Ошибка в CryptAcquireContext: 0x%x\n", GetLastError());
AfxMessageBox(aqsw);
}
// Генерация новой пары ключей
// Ключ сигнатуры
if(!CryptGenKey(
hProv,
AT_SIGNATURE,
CRYPT_EXPORTABLE,
&hSignKey))
{
aqsw.Format("Ошибка в CryptGenKey (AT_SIGNATURE): 0x%x\n", GetLastError());
AfxMessageBox(aqsw);
}
// Ключ обмена
if(!CryptGenKey(
hProv,
AT_KEYEXCHANGE,
CRYPT_EXPORTABLE,
&hXchgKey))
{
aqsw.Format("Ошибка в CryptGenKey (AT_KEYEXCHANGE): 0x%x\n", GetLastError());
AfxMessageBox(aqsw);
}
// Генерация сессионного ключа
if (!CryptGenKey(
hProv,
CALG_G28147,
CRYPT_EXPORTABLE,
&hKey))
{
res=GetLastError();
if(res==ERROR_INVALID_HANDLE) AfxMessageBox("One of the parameters specifies an invalid handle.");
if(res==ERROR_INVALID_PARAMETER) AfxMessageBox("One of the parameters contains an invalid value. This is most often an invalid pointer.");
if(res==NTE_BAD_ALGID) AfxMessageBox("The Algid parameter specifies an algorithm that this CSP does not support.");
if(res==NTE_BAD_FLAGS) AfxMessageBox("The dwFlags parameter contains an invalid value.");
if(res==NTE_BAD_UID) AfxMessageBox("The hProv parameter does not contain a valid context handle.");
if(res==NTE_FAIL) AfxMessageBox("The function failed in some unexpected way.");
//if(res==NTE_SILENT_CONTEXT) AfxMessageBox("The provider could not perform the action because the context was acquired as silent.");


aqsw.Format("Ошибка в CryptGenKey (CALG_G28147): 0x%x\n", GetLastError());
AfxMessageBox(aqsw);
}
// Определение размера выделяемой памяти для экспорта сессионного ключа
if(!CryptExportKey(
hKey,
hXchgKey,
SIMPLEBLOB,
0,
NULL,
&dwBlobLen))
{
res=GetLastError();
if(res==ERROR_INVALID_HANDLE) AfxMessageBox("One of the parameters specifies an invalid handle. ");
if(res==ERROR_INVALID_PARAMETER) AfxMessageBox("One of the parameters contains an invalid value. This is most often an invalid pointer.");
if(res==ERROR_MORE_DATA) AfxMessageBox("If the buffer specified by the pbData parameter is not large enough to hold the returned data, the function sets the ERROR_MORE_DATA code and stores the required buffer size, in bytes, in the variable pointed to by pdwcbDataLen.");
if(res==NTE_BAD_FLAGS) AfxMessageBox("The dwFlags parameter is nonzero.");
if(res==NTE_BAD_KEY) AfxMessageBox("One or both of the keys specified by hKey and hExpKey are invalid.");
if(res==NTE_BAD_KEY_STATE) AfxMessageBox("You do not have permission to export the key. That is, when the hKey key was created, the CRYPT_EXPORTABLE flag was not specified.");
if(res==NTE_BAD_PUBLIC_KEY) AfxMessageBox("The key BLOB type specified by dwBlobType is PUBLICKEYBLOB, but hExpKey does not contain a public key handle.");
if(res==NTE_BAD_TYPE) AfxMessageBox("The dwBlobType parameter specifies an unknown BLOB type.");
if(res==NTE_BAD_UID) AfxMessageBox("The CSP context that was specified when the hKey key was created cannot be found.");
if(res==NTE_NO_KEY) AfxMessageBox("A session key is being exported, and the hExpKey parameter does not specify a public key.");

}
// Выделение памяти для БЛОБ-указателя.
pbKeyBlob = (BYTE*)malloc(dwBlobLen);
//
if(!CryptExportKey(
hKey,
hXchgKey,
SIMPLEBLOB,
0,
pbKeyBlob,
&dwBlobLen))
{
AfxMessageBox("Error during CryptExportKey.");
}
// Work with a keys
if(!ExportKey.Open("ExportKey.dat",CFile::modeCreate| CFile::modeWrite ))
{
#ifdef _DEBUG
afxDump << "Unable to open file" << "\n";
#endif
}
ExportKey.Write(pbKeyBlob,dwBlobLen);
// After all processing, clean up.

//--------------------------------------------------------------------
// Free the memory used by the key blob.

free(pbKeyBlob);

// Destroy the session key.
if(hKey)
CryptDestroyKey(hKey);

// Destroy the signature key handle.
if(hSignKey)
CryptDestroyKey(hSignKey);

// Destroy the key exchange key handle.
if(hXchgKey)
CryptDestroyKey(hXchgKey);

// Release the provider handle.
if(hProv)
CryptReleaseContext(hProv, 0);
printf("The program ran to completion without error. \n");

И вылетает ошибка, что у меня нет прав на экспорт ключа. Это происходит при вычислении памяти для экспорта ключа. Код NTE_BAD_KEY_STATE.
А???
 
Ответы:
16.04.2003 13:31:44Uri
Ага, все правильно. На CryptExportKey в нашем провайдере есть ограничения и Вы на них натолкнулись.
Я Вам в ответе уже давал информацию как нуно использовать алгоритм Деффи-Хелмана.
Воспользуйтесь им.
16.04.2003 14:10:46Куканов В.В.
Спасибо за подсказку. Сразу не понял. Ничего в шифровании не понимаю.
17.04.2003 9:26:18Uri
Да, экспорт сессионного ключа можно сделать только на ключе Деффи-Хелмана...