13.09.2006 10:01:52Ключ согласования Ответов: 2
Евгений
Хочу зашифровать некоторые данные по алгоритму Диффи-Хелмана, делаю так:

1. Получаю контекст криптопровайдера CryptAcquireContext(&hProv, KEY_CONT_NAME, PROV_NAME, PROV_TYPE, 0)

2. Получаю дискриптор сертификата.

3. Импортирую публичный ключ CryptImportPublicKeyInfoEx(hProv, certContext.dwCertEncodingType, &certContext.pCertInfo->SubjectPublicKeyInfo, CALG_GR3410, 0, NULL, &hPublicKey)

4. Экспортирую открытый ключ в блоб CryptExportKey(hPublicKey, 0, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)

5. Получаю ключевую пару отправителя CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hPrivateKey)

6. Пытаюсь импортировать ключ согласования CryptImportKey(hProv, pbKeyBlob, dwBlobLen, hPrivateKey, 0, &hAgreeKey)

И вот эта функция возвращает Bad data. Причем cpcspi пишет: CPImportKey!ImportKey fail ret obj!0x80090005(-2146893819)

В чем может быть дело, никак не пойму?
 
Ответы:
13.09.2006 11:32:09Kirill Sobolev
Алгоритмы открытого и секретного ключа одинаковые?
CryptExportKey нормально проходит?
13.09.2006 11:51:37Евгений
Экспорт открытого ключа происходит без ошибок.

Используя Test Center CRYPTO-PRO, создал два контейнера Sender и Recipient, с новым набором ключей (оба). Криптопровайдер и размер ключа одиниковый по умолчанию. Установил галку "Пометить ключ как экспортируемый". Тип сертификата "проверки подлинности клиента". После этого проинсталировал сертификаты.

Использую для секретного ключа контейнер Sender, а публичный ключ беру из сертификата получателя.

Подозреваю, что алгоритмы одинаковые (полезные ссылки приветствуются).