CryptoAPI - как извлечь открытый ключ RSA из приватного

Используя Windows CryptoAPI, можно ли получить открытый ключ RSA из закрытого ключа, который был импортирован (не сгенерирован)?

Если я использую CryptGenKey, я могу вызвать CryptExportPublicKeyInfo и CryptImportPublicKeyInfo, чтобы получить дескриптор открытого ключа. Однако, когда я пытаюсь сделать то же самое с закрытым ключом, декодированным из PEM и импортированным с использованием:

CryptImportKey(hCSP, pKeyBuf, cbKeyBuf, 0, CRYPT_EXPORTABLE, &hPrivKey)

импорт закрытого ключа завершается успешно, и у меня есть действительный дескриптор, но последующий вызов CryptExportPublicKeyInfo завершается неудачно с ошибкой «Ключ не существует». Похоже, что отсутствует еще один вызов между CryptImportKey и CryptExportPublicKeyInfo, но я не могу найти этот вызов API.


person Alex    schedule 22.02.2015    source источник
comment
Как выглядит ваш CryptExportPublicKey звонок? Это ключ подписи или ключ шифрования?   -  person erickson    schedule 24.02.2015
comment
Импортируемый PEM был сгенерирован путем вызова CryptExportKey (hKey, 0, PRIVATEKEYBLOB, 0, & buf, & size), а затем buf закодирован в DER - ›PEM. Я могу успешно импортировать закрытый ключ из PEM, но не знаю, как получить из него открытый ключ.   -  person Alex    schedule 24.02.2015
comment
Я говорю о последующем неудачном вызове, а не о происхождении закрытого ключа. Второй экспорт выглядит так же, как исходный? Я не знаком с CryptoAPI, но другие API, которые я хорошо знаю, предлагают API, чтобы дать вам прозрачное представление о ключевых материалах. В случае закрытого ключа RSA это обычно дает вам структуру, представляющую ключ в форме китайской теоремы об остатках (CRT), которая будет иметь ряд больших целочисленных членов. Я не видел ничего подобного, быстро просматривающего документы Windows CryptoAPI. Это звонит в колокол?   -  person erickson    schedule 24.02.2015
comment
Спасибо за интерес к этому вопросу, я разобрался (см. код) и Я могу продолжить работу, но мне все еще не на 100% понятно, почему CryptExportPublicKeyInfo () / CryptImportPublicKeyInfo () не работает.   -  person Alex    schedule 25.02.2015


Ответы (1)


Проблема с экспортом / импортом открытого ключа заключалась в том, что закрытый ключ был сгенерирован с использованием AT_SIGNATURE вместо AT_EXCHANGE. См. объяснение и пример кода

person Alex    schedule 13.03.2015