| ||||
| ||||
Пытаюсь экспортировать секретный ключ, шифруя его на сессионном (сессионный создаю по паролю с помощью 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." | ||||
Ответы: | ||||
| ||||
А не могли бы вы прислать не псевдокод а кусок программы целиком (info@cryptopro.ru) | ||||
| ||||
"КриптоПро CSP" не поддерживает возможность экспорта секретного ключа. CryptGenKey(..AT_KEYEXCHANGE, CRYPT_EXPORTABLE) должен игнорировать установку CRYPT_EXPORTABLE для ключей AT_KEYEXCHANGE и AT_SIGNATURE. Кроме того, в нашей документации не рекомендуется использовать функцию CryptDeriveKey на результат вычисления хэш функции ГОСТ Р 34.11-94. Такое использование очень часто оказывается криптографически не стойким и требует тщательного криптографического анализа в каждом конкретном случае. В частности, использование CryptDeriveKey в Вашем примере не корректно по ряду причин, одна из которых то, что ключ однозначно связан с паролем. P.S. Если Вам необходимо работать со множеством секретных ключей, то Вы можете создавать пары CryptGenKey и экспортировать/импортировать их с помощью AT_EXCHANGE. | ||||
| ||||
>"КриптоПро CSP" не поддерживает возможность >экспорта секретного ключа. А вот очень неудобно то, что Клиент не сможет перенести (по крайней мере, стандартными средствами работы с сертификатами в IE5) свой Сертификат с секретным ключом с одного компьютера на другой (в Internet Explorer'е опция экспорта с секретным ключом заблокирована на сгенеренный Вашим CSP Сертификат, хотя Сертификат проассоциирован с секретным ключом). Или это глюк? (моя машина - Win98, IE5). Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ? >Если Вам необходимо работать со множеством >секретных ключей, то Вы можете создавать пары >CryptGenKey и экспортировать/импортировать их с >помощью AT_EXCHANGE. Необходимо на стороне сервера. Имеется в виду - хранить в разных контейнерах в реестре и подгружать с помощью CryptGetUserKey? А на случай, если комп накроется, как правильнее всего все это дело резервно куда-нибудь скопировать? Или что Вы имели ввиду "экспортировать/импортировать их с помощью AT_EXCHANGE" - есть все-таки возможность экспорта пары приватный-публичный? Поясните как, пожалуйста - на примере или хотя бы последовательность действий (надоело экспериментировать; или - где почитать?) Спасибо | ||||
| ||||
>А не могли бы вы прислать не псевдокод а кусок >программы целиком (info@cryptopro.ru( К сожалению, сходу не могу - Дельфи, и много служебных библиотечек подцеплено с функциями вроде LoadDLL или обработки ошибок CryptoAPI А что - есть подозрение, что ошибка в коде, а не принципиальная невозможность экспортировать секретный ключ с помощью CryptExportKey, как мне пишет Serge3? ("КриптоПро CSP" не поддерживает возможность экспорта секретного ключа.") Тогда мне бы примерчик работающего кода... (с помощью чего экспортировать секретный ключ мне вообще-то все равно, можно и без Derive...) | ||||
| ||||
> Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ? Если клиент использует отделяемый ключевой носитель (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 не приспособлены для работы с этими "временными" ключевыми парами, точнее для связывания этих пар с сертификатами. > или хотя бы последовательность действий (надоело экспериментировать; или - где почитать?) А оно Вам надо? Если надо, то изложу, но следует помнимать, что такое использование заводит нас в достаточно сложную организацию ПКЗИ. В частности, очень не простые вопросы компрометации ключей и т.п. | ||||
| ||||
>> Или - как перенести Сертификат с приватным ключом на другой комп и там восстановить связь Сертификат-секретный ключ? > > Если клиент использует отделяемый ключевой носитель (container): дискета, SmartCard, TouchMemory, eToken. То для переноса ключа и сертификата на другой компьютер ему нужно: убедится в его безопасности, вставить свой носитель в считыватель и нажать кнопку "Control Panel/CryptoPro CSP/Certificates on carrier media.../Install Certificate..." > То же самое можно сделать из CryptoAPI, в частности, наш пример csptest демонстрирует эту возможность при вызове "csptest -property -cinstall...". | ||||
| ||||
Пример есть вот здесь. http://www.cryptopro.ru/CryptoPro/forum/myforum.asp?q=4 Экспортируется сессионный симметричный ключ. | ||||