Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline akulema  
#1 Оставлено : 28 октября 2008 г. 23:08:03(UTC)
akulema

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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.

Правильно ли, вот в чем вопрос? Заранее спасибо.
Offline akulema  
#2 Оставлено : 28 октября 2008 г. 23:23:06(UTC)
akulema

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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);


И в результате получаю абсолютно другой ключ (то есть не такой как я описал выше). Я так понимаю, что они должны быть одинаковыми.
Offline Kirill Sobolev  
#3 Оставлено : 29 октября 2008 г. 13:17:46(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
CERT_PUBLIC_KEY_INFO и PUBLICKEYBLOB - это разные структуры, хотя и соответствующие одному и тому же объекту. Грубо говоря, CERT_PUBLIC_KEY_INFO - это внешнее представление ОК, он так лежит в сертификате, а PUBLICKEYBLOB - внутреннее представление самого CSP.
Техническую поддержку оказываем тут
Наша база знаний
Offline akulema  
#4 Оставлено : 29 октября 2008 г. 14:34:41(UTC)
akulema

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

То есть получается, что, по сути, открытый ключ (то есть та последовательность, которой можно проверить подпись) - это есть PUBLICKEYBLOB ? И если есть необходимость получить этот самый ОК, то необходимо делать это через PUBLICKEYBLOB? Или существует какая то связь, может быть есть способ перевести из представления в сертификате в реальный ОК? Извиняюсь за дотошность, просто хочется быть уверенным, что я все правильно понял.

Отредактировано пользователем 29 октября 2008 г. 14:51:16(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#5 Оставлено : 29 октября 2008 г. 18:00:06(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Что бы импортировать ОК в провайдер из PUBLICKEYBLOB надо использовать CryptImportKey, из CERT_PUBLIC_KEY_INFO - CryptImportPublicKeyInfo. В обоих случаях получается ключ, который можно использовать для проверки подписи, например.
Техническую поддержку оказываем тут
Наша база знаний
Offline akulema  
#6 Оставлено : 29 октября 2008 г. 18:13:18(UTC)
akulema

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Просто так уж вышло в моей системе, что я должен сравнивать ОК. Предположим, что я решу использовать PUBLICKEYBLOB для получения ОК, дабы потом сравнивать с ним другие. но ведь еще нужно обрабатывать списки отзывов, а в каком виде там лежат открытые ключи? Как тогда быть.
Offline Kirill Sobolev  
#7 Оставлено : 29 октября 2008 г. 18:29:15(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,732
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Сравнивать лучше всего CERT_PUBLIC_KEY_INFO, даже есть функция CertComparePublicKeyInfo. В списках отзыва нет открытых ключей, там лежат серийные номера.
Техническую поддержку оказываем тут
Наша база знаний
Offline akulema  
#8 Оставлено : 29 октября 2008 г. 18:31:54(UTC)
akulema

Статус: Активный участник

Группы: Участники
Зарегистрирован: 17.10.2008(UTC)
Сообщений: 70

Спасибо, понял.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.