Как вынуть публичный ключ из сертификата, для дальнейшей подписи и шифрования данных через библиотеку CryptoAPI? Здравствуйте, пытаюсь через библиотеку CryptoAPI используя C++, реализовать функционал подпись данных, используя USB токен. В документации MSDN написано что подпись можно реализовать через функцию CryptSignHash где 1 аргументом, нужно получить HCRYPTHASH, который в свою очередь получается через функцию CryptCreateHash, в аргументах которого нужно передать HCRYPTKEY, который как я понимаю должен содержать в себе публичный ключ сертификата, но я не могу понять, как получить публичный ключ сертификата, могу получить сам сертификат (он установлен в пользовательские сертификаты), но что с ним делать дальше не понимаю... может кто то напишет пример как вынуть этот публичный ключ для сертификата... буду очень благодарен...
Для того чтобы извлечь публичный ключ из сертификата, вам нужно сначала получить сам сертификат, а затем извлечь из него открытый ключ.
Примерный код для получения публичного ключа из сертификата может выглядеть следующим образом:
#include <windows.h>#include <wincrypt.h>
HCERTSTORE hCertStore = CertOpenSystemStore(NULL, L"MY");
if (!hCertStore) {
// Обработка ошибки открытия хранилища сертификатов
}
PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"SubjectName", NULL);
if (!pCertContext) {
// Обработка ошибки поиска сертификата
}
CRYPT_BIT_BLOB publicKeyBlob;
if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData, pCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, 0, NULL, &publicKeyBlob, NULL)) {
// Обработка ошибки декодирования открытого ключа
}
// publicKeyBlob содержит открытый ключ сертификата
// Освобождение ресурсов
CertFreeCertificateContext(pCertContext);
CertCloseStore(hCertStore, 0);
После выполнения этого кода в переменной publicKeyBlob будет содержаться открытый ключ сертификата в виде блоба.
Теперь вы можете использовать этот открытый ключ для подписи данных с помощью библиотеки CryptoAPI.