15.02.2006 12:54:39Изменение свойств закрытого ключа Ответов: 5
Дмитрий
Можно ли снять флаг CRYPT_EXPORTABLE в контейнере секретного ключа, ключ в котором был сгенерирован с этим флагом? Я пытался это делать следующим образом:

HCRYPTPROV hProv;
HCRYPTKEY phUserKey;

// Получаем контекст криптопровайдера
BOOL b=CryptAcquireContext (&hProv, "REQUEST_CONT", CP_DEF_PROV, PROV_GOST_DH,0);
if (!b)
{
AfxMessageBox("Err CryptAcquireContext");
return;
}

//Получаем хендл ключа
b=CryptGetUserKey(hProv,AT_KEYEXCHANGE,&phUserKey);
if (!b)
{
AfxMessageBox("Err CryptGetUserKey");
CryptReleaseContext (hProv, 0);
return;
}

DWORD dwFlag=0;
DWORD dwLen=4;

//Считываем установленные флаги
if (!CryptGetKeyParam (phUserKey, KP_PERMISSIONS,(UCHAR*)&dwFlag,&dwLen, 0))
{
AfxMessageBox("Error set cert");
}

//Сбрасываем флаг CRYPT_EXPORTABLE и пытаемся установить новые свойства
dwFlag&=~CRYPT_EXPORT;
if (!CryptSetKeyParam (phUserKey, KP_PERMISSIONS,(UCHAR*)&dwFlag, 0))
{
AfxMessageBox("Error set cert");
}

CryptDestroyKey(phUserKey);

CryptReleaseContext(hProv, 0);

Вроде говорит, что CryptSetKeyParam прошла успешно, но на самом деле сброса флага не происходит.
 
Ответы:
15.02.2006 13:55:05Василий
А какой CSP (номер версии и номер сборки)?
15.02.2006 14:36:36Дмитрий
2.0, 2049
16.02.2006 10:48:39Василий
Тут дело в том, что флажок, разрешающий копирование контейнера и флажок, разрешающий экспорт ключа - не одно и то же. У ключа есть дополнительный атрибут - признак возможности копирования в составе контейнера. И этот атрибут выставляется по значению флага CRYPT_EXPORTABLE при создании контейнера. Тогда как флажок CRYPT_EXPORT говорит о возможности или невозможности экспорта ключа в блоб (зашифрованный на ключе Диффи-Хеллмана).
Если Вы хотите, сохранив то же значение ключа, снять признак возможности копирования контейнера, то единственный путь - экспорт этого ключа в блоб (PRIVATEKEYBLOB) и затем импорт его из блоба (он перезапишется и снимется атрибут, разрешающий копирование контейнера).
16.02.2006 16:11:46Дмитрий
Пробовал на основе вашего кода по копированию контейнера. Везде где есть флаги CRYPT_EXPORTABLE установил их в 0(в том числе и в функции CryptImportKey). Всеравно контейнер копируется.
17.02.2006 18:23:45Василий
Можете исходник примера скинуть на e-mail?