Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,395 Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 718 раз в 622 постах
|
хм Цитата: CRYPT_ENCRYPT_MESSAGE_PARA Structure .... hCryptProv This member is not used and should be set to NULL.
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 15.02.2008(UTC) Сообщений: 11
|
maxdm написал: CRYPT_ENCRYPT_MESSAGE_PARA Structure .... hCryptProv This member is not used and should be set to NULL.
странно, все описания смотрю в локальном мсдн, который вместе со студией ставится. там этой строчке нет. а сейчас посмотрел в онлайновой версии. действительно так написано. но тогда вопрос как функция CeryptEncryptMessage узнает каким криптопровайдером шифровать сообщение? Из сертификата по-моему она такую информацию не достанет. В любом случае попробую передавать NULL и напишу что получилось.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 15.02.2008(UTC) Сообщений: 11
|
передаю NULL - работает :) проверил на сертификате с ГОСТом и с RSA. а как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER ?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Контейнер - это привязка секретного ключа к сертификату Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат. Цитата:CertGetCertificateContextProperty в данном случае не вернет ошибки. Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое? Цитата: в осталных случаях провайдер не должен этого делать. В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного. Цитата:как тогда правильно, имея только сертификат, определить какой OID алгоритма использовать в структуре CRYPT_ALGORITHM_IDENTIFIER Надо смотреть какие алгоритмы поддерживает CSP - CryptGetProvParam(.., PP_ENUMALGS, ..) |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 15.02.2008(UTC) Сообщений: 11
|
Конкретно для Крипто-про в CRYPT_ALGORITHM_IDENTIFIER.pszObjId похоже можно вообще передавать любую строку, даже просто "" работает :) Отредактировано пользователем 26 февраля 2008 г. 16:17:38(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Работает :) Но сделано это было не от хорошей жизни и тем более не является правильным способом задания алгоритма шифрования в общем случае. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 21.02.2008(UTC) Сообщений: 5 Откуда: Донецк
|
Цитата:Да, ошибка вылезет в момент создания подписи, вернее не ошибка а предложение указать нужный контейнер. А вот такой вопрос - CryptAcquireCertificatePrivateKey нормально работает с сертификатам, у которых ссылки на секретный ключ нет (например сертификат прочитан из файла), а смогут ли высокоуровневые фунции подписи сделаь тоже самое?
1. Откуда бедный пользователь узнает имя контейнера :) , ему вообще быть достаточно ключика на сертификате и знания пин кода. 2. CryptAcquireCertificatePrivateKey не будет работать с сертификатом без приватного ключа, это должно быть понятно из её названия. 3. CryptAcquireCertificatePrivateKey - это и есть высокоуровенвая функция, она напрямую в провайдере не реализуется. Цитата:Нет. Контейнер - это объект для хранения ключевой информации. Сертификат - это связь ОК с текстовой строкой. Вообщем то это 2 независимых объекта, вот для того чтоб их связать можно сертификату прописать ссылку на контейнер секретного ключа. Можно связать наоборот - в контейнер записать сертификат. Цитата: В идеале конечно. Но иногда провайдеру просто неоткуда взять ОК, кроме как вычислить его из секретного.
мда...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
1. Имя контейнера знать придется все равно. Даже функция CryptFindCertificateKeyProvInfo не подключит контейнер, если вдруг его нет в системе. 2. Тем не менее, работает, несмотря на название. И иногда возникают некоторые неприятные эффекты. 3. Это безусловно высокоуровневая функция, но она никак не реализует операцию подписи. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
К AndreyM: стоит задача зашифровать данные с использованием сертификатов.
Первично необходимо сказать, что сертификат должен быть из хранилища сертификатов "My" (Personal). В теории, конечно, привязку ключевого контейнера можно сделать к сертификату в любом хранилище, но для нормальной работы нормальной программы все-таки рекомендую ограничить пользователя одним хранилищем.
После выбора сертификата из данного хранилища уже (заранее!) известно, что данный сертификат содержит привязку к ключевому контейнеру (иначе данный сертификат просто не будет отображаться в хранилище "My" и не будет доступен для выбора). Другой вопрос, что существование данного контейнера ключей и секретного ключа в нем должна быть проверена. Как это сделать уже рассказали.
Также после выбора сертификата известен криптопровайдер на котором можно выполнять операции подписи/шифрования (вообще-то не все сертификаты можно использовать одновременно для всех этих действий, но ограничимся простым примером). У данного криптопровайдера перебираем все его алгоритмы (ранее тоже пояснили как именно) и предлагаем их для выбора пользователю.
После все этих манипуляций получаем полный набор информации для осуществления необходимой операции.
|
С уважением, Юрий Строжевский |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 15.02.2008(UTC) Сообщений: 11
|
Чтобы зашифровать данные не обязательно ведь, чтобы у сертификата была ссылка на контейнер с закрытым ключем. Или я не прав? И кстати в хранилице MY можно установить сертификат у которого есть только открытый ключ. И отображаться он там будет. И даже наверное зашифровать что-нибудь им получится.
Я решил делать по такому алгоритму: Сначала выбираем криптопровайдер, потом перечисляем его алгоритмы CryptGetProvParam(.., PP_ENUMALGS, ..) и, о да, как долго я искал как сделать, с помощью GET_ALG_CLASS(x) проверяем чтобы алгоритм был ALG_CLASS_DATA_ENCRYPT (EncryptAlgorithm.pszObjId ведь параметр указывает на алгоритм шифрования данных сессионным ключем). Потом показываем сертификаты CryptUIDlgSelectCertificate из хранилища MY но потом наверное придется из того, куда ставятся сертификаты от других пользователей, фильтруя из так, чтобы у сертификата pRecipientCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId присутствовал в списке поддерживаемых алгоритмов выбранного ранее криптопровайдера.
И уже даже почти получилось это все реализовать :)
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close