| ||||
| ||||
Почему при экспорте ключа ругается что нет прав на экспорт? // Генерация сессионного ключа 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."); } // Экспорт сессионного ключа // Determine size of the key blob, and allocate memory. free(pbKeyBlob); dwBlobLen=0; if(!CryptExportKey(hKey,hOpenKey,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."); } | ||||
Ответы: | ||||
| ||||
Ну он же по-русски говорит!!! "You do not have permission to export the key. That is, when the hKey key was created, the CRYPT_EXPORTABLE flag was not specified." Нуно взвести флаг EXPORTABLE на ключевом контейнере... | ||||
| ||||
А он там взведен... HCRYPTPROV hProv; // CSP handle //HCRYPTKEY hSignKey; // Signature key pair handle HCRYPTKEY hXchgKey; // Exchange key pair handle HCRYPTKEY hOpenKey; // Импортированный открытый ключ HCRYPTKEY hKey; // Session key handle BYTE *pbKeyBlob; // Pointer to a simple key blob DWORD dwBlobLen; // The length of the key blob CHAR * pszContainer="zaxs2"; CHAR * pszProvider="Crypto-Pro Cryptographic Service Provider"; CString aqsw;// строка для выдачи сообщений об ошибках CStdioFile ImportKey,DestinationFile,SourseFile,ExportOpenSenderKey,ExportSessionSenderKey; CString FileString; DWORD res; // Получение дескриптора криптопровайдера if(!(res=CryptAcquireContext( &hProv, pszContainer, pszProvider, 2, 0))) { // if(res==NTE_KEYSET_NOT_DEF) // { if(!CryptAcquireContext( &hProv, pszContainer, pszProvider, 2, CRYPT_NEWKEYSET)) { aqsw.Format("Ошибка в CryptAcquireContext: 0x%x\n", GetLastError()); AfxMessageBox(aqsw); } // } // aqsw.Format("Ошибка в CryptAcquireContext: 0x%x\n", GetLastError()); // AfxMessageBox(aqsw); } // Получение или генерация новой пары ключей шифрования // Ключ обмена if(!CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hXchgKey)) { AfxMessageBox("Ключа обмена нет - будет генерироваться новый"); if(!CryptGenKey( hProv, AT_KEYEXCHANGE , CRYPT_EXPORTABLE, &hXchgKey)) { aqsw.Format("Ошибка в CryptGenKey (AT_SIGNATURE): 0x%x\n", GetLastError()); AfxMessageBox(aqsw); } if(!CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hXchgKey)) { 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_KEY) AfxMessageBox("The dwKeySpec parameter contains an invalid value."); if(res==NTE_BAD_UID) AfxMessageBox("The hProv parameter does not contain a valid context handle."); if(res==NTE_NO_KEY) AfxMessageBox("The key requested by the dwKeySpec parameter does not exist."); } } // Импорт открытого ключа получателя if(!ImportKey.Open("ExportKey.dat",CFile::modeRead)) { #ifdef _DEBUG afxDump << "Unable to open file" << "\n"; #endif } dwBlobLen=ImportKey.GetLength(); if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) { ; } else { AfxMessageBox("Out of memory."); }; ImportKey.Read(pbKeyBlob,dwBlobLen); CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hOpenKey);// Получили в hOpenKey дескриптор открытого ключа получателя // Генерация сессионного ключа 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."); } // Экспорт сессионного ключа // Determine size of the key blob, and allocate memory. free(pbKeyBlob); dwBlobLen=0; if(!CryptExportKey(hKey,hOpenKey,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); // export to the file session key CryptExportKey(hKey,hOpenKey,SIMPLEBLOB,0,pbKeyBlob,&dwBlobLen); ExportSessionSenderKey.Open("ExportSessionSenderKey.dat",CFile::modeCreate | CFile::modeWrite); ExportSessionSenderKey.Write(pbKeyBlob,dwBlobLen); // запись непосредственно блоба. free(pbKeyBlob);// clean up the pbKeyBlob // Экспорт открытого ключа // Вычисление размера буфера для БЛОБ. if(!CryptExportKey( hXchgKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwBlobLen)) { AfxMessageBox("Не получилось вычислить размер буфера для БЛОБ"); } // if(pbKeyBlob = (BYTE*)malloc(dwBlobLen)) { ; } else { AfxMessageBox("Out of memory."); } // Экспорт ключа if(!CryptExportKey( hXchgKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)) { AfxMessageBox("Error during CryptExportKey."); } // Work with a keys if(!ExportOpenSenderKey.Open("ExportOpenSenderKey.dat",CFile::modeCreate| CFile::modeWrite )) { #ifdef _DEBUG afxDump << "Unable to open file" << "\n"; #endif } ExportOpenSenderKey.Write(pbKeyBlob,dwBlobLen); free(pbKeyBlob); // Чтение данных из исходного файла SourseFile.Open("zaxscd.txt",CFile::modeRead); dwBlobLen=SourseFile.GetLength()+1; pbKeyBlob = (BYTE*)malloc(dwBlobLen); SourseFile.Read(pbKeyBlob,dwBlobLen); // Шифрование файла CryptEncrypt(hKey,0,TRUE,0,pbKeyBlob,&dwBlobLen,dwBlobLen); // Запись шифрованных данных в файл //dwBlobLen=_msize(pbKeyBlob); DestinationFile.Open("aqswde.txt",CFile::modeCreate| CFile::modeWrite); DestinationFile.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"); | ||||