| ||||
| ||||
Подскажите, пожалуйста, можно ли, имея открытый контейнер (от ф-ии CryptAcquireContext) получить CERT_INFO соответствующего этому контейнеру открытого ключа? | ||||
Ответы: | ||||
| ||||
CERT_INFO - относится к сертификату, а не к открытому ключу. Обычно задача обратная - по сертификату (из хранилища) нужно найти соответствующий закрытый ключ, записанный в контейнере. В том случае, если сертификат установлен в контейнер секретного ключа, его можно прочитать оттуда и получить всю инфу. (функцией CryptGetKeyParam (... KP_CERTIFICATE...), см. исходники нашего примера csptest - http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip ) Если же сертификат не установлен в контейнер, то не судьба... Хотя бы потому, что может быть много разных сертификатов, соответствующих одной ключевой паре. | ||||
| ||||
Перефразирую вопрос. Требуется ли мне для расшифровки присланного мне сообщения извлекать собственный сертификат или достаточно только имеющегося контейнера? Если достаточно, то как мне определить, подходит ли конкретно этот контейнер? Насчет KP_CERTIFICATE - это пример я видел. Однако не нашел в MSDN упоминания об этом значении. | ||||
| ||||
Всё зависит от того, на каком уровне Вы работаете. Есть функции шифрования-дешифрования, которым даются на вход только сертификаты. (примеры см. в том же csptest-е). При этом они сами вызывают функции более низкого уровня: для открытия контейнера (CryptAcquireContext), для доступа к ключам (CryptGetUserKey), для создания, экспорта-импорта сессионного ключа (CryptGenKey, CryptExportKey, CryptImportKey), для задания синхровектора (CryptSetKeyParam), для шифрования/дешифрования (CryptEncrypt, CryptDecrypt). Так вот, на низком уровне сертификаты не нужны. Тут уж ваша задача задать, какие контейнеры будут использоваться для за/расшифрования. В любом случае, не возникнет задачи определения сертификата, соответствующего открытому функцией CryptAcquireContext контейнеру. | ||||
| ||||
Теперь разобрался. Спасибо за помощь. | ||||