| ||||
| ||||
Добрый день. Хотелось бы получить ответ на следующий вопрос: почему при получении открытого ключа из контейнера и получении этого ключа из соответствующего сертификата ключи оказываются различными? Подробнее: - контейнер содержит только ключ обмена - установка сертификата проводилась как вашей утилитой (через панель управления) так и собственным кодом (было два экперимента) - разница в ключах не имеет отношения к заголовку ключевого блоба - разница выявляется и при использовании - открытый ключ из контейнера получается через CryptGetUserKey(..., AT_KEYEXCHANGE, ...) - открытый ключ из сертификата получаетя через CrytpImportPublicKeyEx(...) - полученый открытый ключ используется для формирования ключа обмена при шифровании сессионного ключа - если использовать открытые ключи, полученные из различных источников, то РЕЗУЛЬТАТ ЭКСПОРТА СЕССИОННОГО КЛЮЧА ОТЛИЧАЕТСЯ, и при перекресном использовании (один для импорта, другой для экспорта) система выдает BAD_DATA - так как ассиметричные ГОСТ-овские ключи являются по сути ключами DH, то закрытому ключу всегда соотвествует единственный открытый (обратное не верно) Собственно вопрос: почему ключ из сертификата не только отличается от ключа из контейнера (что может быть объяснено различным представлением), но и различно ведет себя? Если в сертификате содержится другой ключ, то что это за ключ? P.S. Версия CryptoPro - 2.0 | ||||
Ответы: | ||||
| ||||
1. Ключ DH - симметричный (алгоритм - ГОСТ 28147-89). 2. > - открытый ключ из контейнера получается через CryptGetUserKey(..., AT_KEYEXCHANGE, ...) Нет, этой функцией получается ключевая пара, открытый ключ из неё для дальнейшего использования надо экспортировать в блоб. 3. Если просто взять открытый ключ, то как Вы превращаете его в ключ DH? Единственный путь - импорт блоба открытого ключа с использованием своего закрытого ключа AT_KEYEXCHANGE. 4. > - если использовать открытые ключи, полученные из различных источников, то РЕЗУЛЬТАТ ЭКСПОРТА СЕССИОННОГО КЛЮЧА ОТЛИЧАЕТСЯ, и при перекресном использовании (один для импорта, другой для экспорта) система выдает BAD_DATA. Нечетко сформулировано. Как для импорта, так и для экспорта сессионного ключа используется один и тот же ключ DH (а не открытый ключ!), но делается он из блоба открытого ключа и некоторого закрытого ключа AT_KEYEXCHANGE. Если всё так, то возможны разные умолчания - в параметрах алгоритма ключа DH - CALG_PRO_EXPORT, CALG_SIMPLE_EXPORT. | ||||
| ||||
DH - вряд ли симметричный, а результат алгоритма DH -да ;-) | ||||
| ||||
Ну хорошо, уточняю - ключ парной связи, полученный по алгоритму DH, используется для шифрования других ключей с использованием симметричного алгоритма ГОСТ 28147-89 | ||||