| ||||
| ||||
Доброго времени суток! Разясните вот какой вопрос: //Создаю два ключа (обмена и подписи) 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 равны по содержанию! Разве так должно быть? Я думал ключ обмена отличается от ключа подписи, если последний был сгенерирован. Может быть открытый ключ общий, а закрытые разные! Где подвох? | ||||
Ответы: | ||||
| ||||
Можно уточнить имя и тип CSP (в CryptAcquireContext)? | ||||
| ||||
if(!CryptAcquireContext(&hProv,nameContainer,NULL,75,CRYPT_SILENT)) GetStringError(szError,cbError); | ||||
| ||||
А чему равны перед вызовом CopyMemory(&exchangeKey,pEncoded,sizeof(exchangeKey)) значения: cbEncoded и sizeof(exchangeKey) ? и аналогично для ключа подписи. | ||||
| ||||
хм, но структуры CERT_PUBLIC_KEY_INFO может и похожи, но блоб с ключом лежит дальше, и он явно не копируется при sizeof(CERT_PUBLIC_KEY_INFO) | ||||