19.05.2003 9:37:25Экспорт Ответов: 2
Куканов В.В.
Почему при экспорте ключа ругается что нет прав на экспорт?
// Генерация сессионного ключа
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.");
}
 
Ответы:
19.05.2003 10:24:44Uri
Ну он же по-русски говорит!!!
"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 на ключевом контейнере...
19.05.2003 16:01:15Куканов В.В.
А он там взведен...
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");