25.05.2007 11:45:58В чем разница между открытыми ключами EXCHANGE и SIGNATURE Ответов: 4
Сергей
Доброго времени суток!
Разясните вот какой вопрос:

//Создаю два ключа (обмена и подписи)
HCRYPTKEY hUserKey = NULL;
if(!CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hUserKey))
GetStringError(szError,cbError);
CryptDestroyKey(hUserKey);
if(!CryptGenKey(hProv,AT_SIGNATURE,0,&hUserKey))
GetStringError(szError,cbError);
CryptDestroyKey(hUserKey);

BYTE *pEncoded;
DWORD cbEncoded;
static CERT_PUBLIC_KEY_INFO exchangeKey;
static CERT_PUBLIC_KEY_INFO signKey;
//Оба экспортирую
cbEncoded = 0;
if(CryptExportPublicKeyInfo(hProv,AT_KEYEXCHANGE,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,NULL,&cbEncoded))
{
if(cbEncoded>0)
{
pEncoded= new BYTE[cbEncoded];
if(CryptExportPublicKeyInfo(hProv,AT_KEYEXCHANGE,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,(CERT_PUBLIC_KEY_INFO*) pEncoded,&cbEncoded))
{
exp_key_exchange = true;
CopyMemory(&exchangeKey,pEncoded,sizeof(exchangeKey));
}
else GetStringError(szError,cbError);
delete pEncoded;
}
}
else GetStringError(szError,cbError);


if(CryptExportPublicKeyInfo(hProv,AT_SIGNATURE,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,NULL,&cbEncoded))
{
if(cbEncoded>0)
{
pEncoded= new BYTE[cbEncoded];
if(CryptExportPublicKeyInfo(hProv,AT_SIGNATURE,PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,(CERT_PUBLIC_KEY_INFO*) pEncoded,&cbEncoded))
{
exp_key_sign = true;
CopyMemory(&signKey,pEncoded,sizeof(signKey));
}
else GetStringError(szError,cbError);
delete pEncoded;
}
}
else GetStringError(szError,cbError);

exchangeKey и signKey равны по содержанию!
Разве так должно быть? Я думал ключ обмена отличается от ключа подписи, если последний был сгенерирован. Может быть открытый ключ общий, а закрытые разные! Где подвох?
 
Ответы:
25.05.2007 11:56:15Василий
Можно уточнить имя и тип CSP (в CryptAcquireContext)?
25.05.2007 12:12:46Сергей
if(!CryptAcquireContext(&hProv,nameContainer,NULL,75,CRYPT_SILENT))
GetStringError(szError,cbError);
25.05.2007 12:56:05Василий
А чему равны перед вызовом
CopyMemory(&exchangeKey,pEncoded,sizeof(exchangeKey))
значения:
cbEncoded
и
sizeof(exchangeKey) ?

и аналогично для ключа подписи.
26.05.2007 3:40:18maxdm
хм, но структуры CERT_PUBLIC_KEY_INFO может и похожи, но блоб с ключом лежит дальше, и он явно не копируется при sizeof(CERT_PUBLIC_KEY_INFO)