| ||||
| ||||
Подскажите плз почему возникает ошибка. На кнопке такой код: 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. А??? | ||||
Ответы: | ||||
| ||||
Ага, все правильно. На CryptExportKey в нашем провайдере есть ограничения и Вы на них натолкнулись. Я Вам в ответе уже давал информацию как нуно использовать алгоритм Деффи-Хелмана. Воспользуйтесь им. | ||||
| ||||
Спасибо за подсказку. Сразу не понял. Ничего в шифровании не понимаю. | ||||
| ||||
Да, экспорт сессионного ключа можно сделать только на ключе Деффи-Хелмана... | ||||