Может ли кто-нибудь объяснить, почему функция CryptImportKey принимает hPubKey со значением 0 (дескриптор ключа дешифрования) при импорте зашифрованного ключевого блоба сеансового типа с другого компьютера?
Среда такая:
ПК №1: генерирует пару ключей обмена ключами (общедоступный / частный) в локальном контейнере ключей (CryptGenKey
с AT_KEYEXCHANGE), затем экспортирует общедоступную часть как PUBLICKEYBLOB и отправляет ее на ПК №2.
ПК №2: берет открытый ключевой объект с ПК №1 и импортирует его в локальный контейнер ключей. Создает сеансовый ключ в том же локальном контейнере ключей. Экспортирует локальный ключ сеанса контейнера ключей в SIMPLEBLOB (CryptExportKey
), используя открытый ключ, который был импортирован из ключевого большого двоичного объекта клиента (используется для шифрования сеансового ключа).
ПК №1: берет зашифрованный ключевой объект сеанса с ПК №2 и вызывает CryptImportKey
, предоставляя контейнер локального ключа hProv, указатель и длину буфера ключевого двоичного объекта, 0 (ноль) для hPubKey и флагов и указатель на HCRYPTKEY. ручка.
После выполнения вышеизложенного я получаю обратно действительный дескриптор и могу вызывать CryptEncrypt
и CryptDecrypt
, используя полученный дескриптор. Да, если я укажу в CryptImportKey дескриптор пары ключей обмена ключами, сгенерированной на первом шаге выше на ПК № 1, это тоже будет работать. Я просто не понимаю, почему работает 0 для hPubKey, это как если бы CryptoAPI «знает», какой закрытый ключ был для шифрования данных.
Спасибо.