Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.10.2008(UTC) Сообщений: 70
|
Еще раз здравствуйте. Есть у меня проблема, связанная с получение открытого ключа (на этапе создания ключевой пары и сертификата), я бы хотел спросить правильно ли я понимаю ход действия: 1) Вызываю CryptAcquireContext - создаю контекст шифрования. 2) Вызываю CryptGenKey - для созданного контекста создаю ключевую пару. 3) Вызываю CryptExportPublicKeyInfo - получаю объект PCERT_PUBLIC_KEY_INFO, который подставляю в CERT_INFO::SubjectPublicKeyInfo 4) Вызываю код Код:int iOpenKeyLen= 2*CertInfo.SubjectPublicKeyInfo.PublicKey.cbData + 1;
LPSTR szOpenKey= sOpenKey.GetBuffer(iOpenKeyLen);
ByteToStr(CertInfo.SubjectPublicKeyInfo.PublicKey.cbData, CertInfo.SubjectPublicKeyInfo.PublicKey.pbData, szOpenKey);
чтобы получить свой открытый ключ в szOpenKey. Правильно ли, вот в чем вопрос? Заранее спасибо.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.10.2008(UTC) Сообщений: 70
|
Решил все-таки сразу объяснить - почему я интересуюсь. Потому что в другом месте я пытаюсь получить открытый ключ из закрытого вот таким вот образом: Код://Загрузка закрытого ключа.
if(!CryptImportKey(hCryptProv, pbData, iDataLen, 0, 0, &hPrKey))
{
HandleError(_T("Ошибка при вызове CryptImportKey."));
iRes= APL_CRYPT_UNKNOWN_ERROR;
ShowError(GetLastError());
goto release;
}
//Получение открытого ключа пользователя из пары для подписи.
if(!CryptGetUserKey(hCryptProv, AT_KEYEXCHANGE, &hKey))
{
//HandleError(_T("Ошибка при вызове CryptGetUserKey для ключа подписи."));
ShowError(GetLastError());
iRes= APL_CRYPT_UNKNOWN_ERROR;
goto release;
}
//Определение длины ключа.
if(!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwBLen))
{
HandleError(_T("Ошибка при определение длины открытого ключа."));
iRes= APL_CRYPT_UNKNOWN_ERROR;
goto release;
}
//Выделение памяти.
if(!(pbKeyBlob= (BYTE*)malloc(dwBLen)))
{
HandleError(_T("Переполнение памяти. \n"));
iRes= APL_CRYPT_UNKNOWN_ERROR;
goto release;
}
//Экспортирование ключа в pbKeyBlob.
if(!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBLen))
{
HandleError(_T("Ошибка при вызове CryptExportKey."));
iRes= APL_CRYPT_UNKNOWN_ERROR;
goto release;
}
else
TRACE0(_T("ЭКСПОРТИРОВАНИЕ КЛЮЧА ВЫПОЛНЕНО\n"));
//Преобразование строки байтов в строку символов (0-9,A-F).
iBlobLen= 2*dwBLen + 1;
szKeyBlob= sOpenKey.GetBuffer(iBlobLen);
ByteToStr(dwBLen, pbKeyBlob, szKeyBlob);
И в результате получаю абсолютно другой ключ (то есть не такой как я описал выше). Я так понимаю, что они должны быть одинаковыми.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
CERT_PUBLIC_KEY_INFO и PUBLICKEYBLOB - это разные структуры, хотя и соответствующие одному и тому же объекту. Грубо говоря, CERT_PUBLIC_KEY_INFO - это внешнее представление ОК, он так лежит в сертификате, а PUBLICKEYBLOB - внутреннее представление самого CSP. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.10.2008(UTC) Сообщений: 70
|
То есть получается, что, по сути, открытый ключ (то есть та последовательность, которой можно проверить подпись) - это есть PUBLICKEYBLOB ? И если есть необходимость получить этот самый ОК, то необходимо делать это через PUBLICKEYBLOB? Или существует какая то связь, может быть есть способ перевести из представления в сертификате в реальный ОК? Извиняюсь за дотошность, просто хочется быть уверенным, что я все правильно понял. Отредактировано пользователем 29 октября 2008 г. 14:51:16(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Что бы импортировать ОК в провайдер из PUBLICKEYBLOB надо использовать CryptImportKey, из CERT_PUBLIC_KEY_INFO - CryptImportPublicKeyInfo. В обоих случаях получается ключ, который можно использовать для проверки подписи, например. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.10.2008(UTC) Сообщений: 70
|
Просто так уж вышло в моей системе, что я должен сравнивать ОК. Предположим, что я решу использовать PUBLICKEYBLOB для получения ОК, дабы потом сравнивать с ним другие. но ведь еще нужно обрабатывать списки отзывов, а в каком виде там лежат открытые ключи? Как тогда быть.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732 Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Сравнивать лучше всего CERT_PUBLIC_KEY_INFO, даже есть функция CertComparePublicKeyInfo. В списках отзыва нет открытых ключей, там лежат серийные номера. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 17.10.2008(UTC) Сообщений: 70
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close