06.08.2004 9:46:55Открытый ключ сертификата <> открытый ключ контейнера ? Ответов: 3
Михал Копачев
Добрый день.
Хотелось бы получить ответ на следующий вопрос: почему при получении открытого ключа из контейнера и получении этого ключа из соответствующего сертификата ключи оказываются различными?

Подробнее:
- контейнер содержит только ключ обмена
- установка сертификата проводилась как вашей утилитой (через панель управления) так и собственным кодом (было два экперимента)
- разница в ключах не имеет отношения к заголовку ключевого блоба - разница выявляется и при использовании
- открытый ключ из контейнера получается через CryptGetUserKey(..., AT_KEYEXCHANGE, ...)
- открытый ключ из сертификата получаетя через CrytpImportPublicKeyEx(...)
- полученый открытый ключ используется для формирования ключа обмена при шифровании сессионного ключа
- если использовать открытые ключи, полученные из различных источников, то РЕЗУЛЬТАТ ЭКСПОРТА СЕССИОННОГО КЛЮЧА ОТЛИЧАЕТСЯ, и при перекресном использовании (один для импорта, другой для экспорта) система выдает BAD_DATA
- так как ассиметричные ГОСТ-овские ключи являются по сути ключами DH, то закрытому ключу всегда соотвествует единственный открытый (обратное не верно)

Собственно вопрос: почему ключ из сертификата не только отличается от ключа из контейнера (что может быть объяснено различным представлением), но и различно ведет себя? Если в сертификате содержится другой ключ, то что это за ключ?

P.S. Версия CryptoPro - 2.0
 
Ответы:
09.08.2004 12:08:46Василий
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.
18.08.2004 19:02:05SiM
DH - вряд ли симметричный, а результат алгоритма DH -да ;-)
19.08.2004 10:21:02Василий
Ну хорошо, уточняю - ключ парной связи, полученный по алгоритму DH, используется для шифрования других ключей с использованием симметричного алгоритма ГОСТ 28147-89