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