28.08.2001 14:06:25Экспорт секретного ключа Ответов: 7
Влад Степвнов
Пытаюсь экспортировать секретный ключ, шифруя его на сессионном (сессионный создаю по паролю с помощью CryptDeriveKey). Получаю любимую ошибку NTE_BAD_KEY_STATE. Что неверно? Как правильно экспортировать секретный ключ? (если можно, наведите на пример)

Спасибо.

P.S. Пробовал произвести экспорт, например, в таком порядке:

CryptAcquireContext(.. CP_DEF_PROV, PROV_GOST_DH ..)

CryptGenKey(..AT_KEYEXCHANGE, CRYPT_EXPORTABLE) -> key_handle

CryptCreateHash(..CALG_GR3411, 0, 0, ..) -> hash_handle
CryptHashData(hash_handle, <my_password>..)
CryptDeriveKey(..CALG_G28147, hash_handle, 0, ..) -> session_key_handle

CryptExportKey(key_handle, session_key_handle, PRIVATEKEYBLOB, 0, ..) ->
ошибка NTE_BAD_KEY_STATE (0x8009000B) "Key not valid for use in specified state."
 
Ответы:
29.08.2001 18:27:10Игорь Курепкин
А не могли бы вы прислать не псевдокод а кусок программы целиком (info@cryptopro.ru)
29.08.2001 22:34:06Serge3
"КриптоПро CSP" не поддерживает возможность экспорта секретного ключа.

CryptGenKey(..AT_KEYEXCHANGE, CRYPT_EXPORTABLE)

должен игнорировать установку CRYPT_EXPORTABLE для ключей AT_KEYEXCHANGE и AT_SIGNATURE.

Кроме того, в нашей документации не рекомендуется использовать функцию CryptDeriveKey на результат вычисления хэш функции ГОСТ Р 34.11-94. Такое использование очень часто оказывается криптографически не стойким и требует тщательного криптографического анализа в каждом конкретном случае. В частности, использование CryptDeriveKey в Вашем примере не корректно по ряду причин, одна из которых то, что ключ однозначно связан с паролем.

P.S.

Если Вам необходимо работать со множеством секретных ключей, то Вы можете создавать пары CryptGenKey и экспортировать/импортировать их с помощью AT_EXCHANGE.
01.09.2001 3:31:20Vlad Stepanov
>"КриптоПро CSP" не поддерживает возможность
>экспорта секретного ключа.

А вот очень неудобно то, что Клиент не сможет перенести (по крайней мере, стандартными средствами работы с сертификатами в IE5) свой Сертификат с секретным ключом с одного компьютера на другой (в Internet Explorer'е опция экспорта с секретным ключом заблокирована на сгенеренный Вашим CSP Сертификат, хотя Сертификат проассоциирован с секретным ключом). Или это глюк? (моя машина - Win98, IE5). Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ?

>Если Вам необходимо работать со множеством
>секретных ключей, то Вы можете создавать пары
>CryptGenKey и экспортировать/импортировать их с
>помощью AT_EXCHANGE.

Необходимо на стороне сервера.
Имеется в виду - хранить в разных контейнерах в реестре и подгружать с помощью CryptGetUserKey? А на случай, если комп накроется, как правильнее всего все это дело резервно куда-нибудь скопировать?

Или что Вы имели ввиду "экспортировать/импортировать их с помощью AT_EXCHANGE" - есть все-таки возможность экспорта пары приватный-публичный? Поясните как, пожалуйста - на примере или хотя бы последовательность действий (надоело экспериментировать; или - где почитать?)

Спасибо
01.09.2001 3:31:33Vlad Stepanov
>А не могли бы вы прислать не псевдокод а кусок
>программы целиком (info@cryptopro.ru(

К сожалению, сходу не могу - Дельфи, и много служебных библиотечек подцеплено с функциями вроде LoadDLL или обработки ошибок CryptoAPI

А что - есть подозрение, что ошибка в коде, а не принципиальная невозможность экспортировать секретный ключ с помощью CryptExportKey, как мне пишет Serge3? ("КриптоПро CSP" не поддерживает возможность экспорта секретного ключа.")
Тогда мне бы примерчик работающего кода... (с помощью чего экспортировать секретный ключ мне вообще-то все равно, можно и без Derive...)
01.09.2001 12:37:44Serge3
> Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ?

Если клиент использует отделяемый ключевой носитель (container): дискета, SmartCard, TouchMemory, eToken. То для переноса ключа и сертификата на другой компьютер ему нужно: убедится в его безопасности, вставить свой носитель в считыватель и нажать кнопку "Control Panel/CryptoPro CSP/Certificates on carrier media.../Install Certificate..."

> Необходимо на стороне сервера.
> Имеется в виду - хранить в разных контейнерах в реестре и подгружать с помощью CryptGetUserKey? А на случай, если комп накроется, как правильнее всего все это дело резервно куда-нибудь скопировать?

При хранение ключей в реестре с компьютером следует обращаться как с ключевым носителем и, в частности, если он "накроется", то правильно считать все ключи хранившиеся в нём в этот момент скомпрометироваными.

Конечно, Вы можете провести не простое расследование по этому событию и обосновать, хотя бы для себя, что событие гарантировано не могло привести к выдаче третим лица какой либо информации из этого компьютера. И тогда, после его ремонта своими силами (или очень доверенными лицами) Вы можете после восстановления реестра с резевного носителя средствами резервного копирования Windows их не компрометировать.

> Или что Вы имели ввиду "экспортировать/импортировать их с помощью AT_EXCHANGE" - есть все-таки возможность экспорта пары приватный-публичный? Поясните как, пожалуйста - на примере...

Я имел ввиду, что специально разработанный прикладной комплекс защиты информации (ПКЗИ) имеет возможность создавать "временные" ключевые пары функцией CryptGenKey(hProv, CALG_GR3410...) и экспортировать/импортировать их на ключе ключевого носителя AT_EXCHANGE. Сам AT_EXCHANGE или AT_SIGNATURE экспортировать/импортировать нельзя. CryptoAPI и другие стандартные ПКЗИ Microsoft не приспособлены для работы с этими "временными" ключевыми парами, точнее для связывания этих пар с сертификатами.

> или хотя бы последовательность действий (надоело экспериментировать; или - где почитать?)

А оно Вам надо? Если надо, то изложу, но следует помнимать, что такое использование заводит нас в достаточно сложную организацию ПКЗИ. В частности, очень не простые вопросы компрометации ключей и т.п.
01.09.2001 12:43:47Serge3
>> Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ?
>
> Если клиент использует отделяемый ключевой носитель (container): дискета, SmartCard, TouchMemory, eToken. То для переноса ключа и сертификата на другой компьютер ему нужно: убедится в его безопасности, вставить свой носитель в считыватель и нажать кнопку "Control Panel/CryptoPro CSP/Certificates on carrier media.../Install Certificate..."
>
То же самое можно сделать из CryptoAPI, в частности, наш пример csptest демонстрирует эту возможность при вызове "csptest -property -cinstall...".
03.09.2001 9:08:23Игорь Курепкин
Пример есть вот здесь.
http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=4
Экспортируется сессионный симметричный ключ.