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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Svetovidov  
#1 Оставлено : 29 октября 2015 г. 12:22:20(UTC)
Svetovidov

Статус: Участник

Группы: Участники
Зарегистрирован: 08.10.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Добрый день.
Пытаюсь реализовать шифрование - расшифровку данных. Столкнулся со следующей проблемой: При использовании сертификата,
ключевой контейнер которого установлен на носителе РутокенЭЦП получаю ошибку 0x80090019
Импортирую ключ так:
Код:

if(m_pcryptoAPI->CryptImportPublicKeyInfoEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
			&(pRecipientCert->pCertInfo->SubjectPublicKeyInfo),
			0,
			0,
			NULL,
			&hRecipientPublicKey))
{
    //Экспортируем открытый ключ в BLOB
    if(m_pcryptoAPI->CryptExportKey(hRecipientPublicKey,
        NULL,PUBLICKEYBLOB,NULL,pbtPublicKeyBlob,&nPublicKeyBlobSize))
    {
        pbtPublicKeyBlob=new BYTE[nPublicKeyBlobSize];
	
        if(pbtPublicKeyBlob==NULL)
	    dwError=E_OUTOFMEMORY;
	else
	{
	    if(!m_pcryptoAPI->CryptExportKey(hRecipientPublicKey,
					NULL,PUBLICKEYBLOB,NULL,pbtPublicKeyBlob,&nPublicKeyBlobSize))
					dwError=::GetLastError();

		//Уничтожаем объект открытого ключа, т.к. в дальнейшем будем использовать только его BLOB
		m_pcryptoAPI->CryptDestroyKey(hRecipientPublicKey);
		hRecipientPublicKey=NULL;
	}
    }
    else
        dwError=::GetLastError();
}
else
    dwError=::GetLastError();


if(dwError==ERROR_SUCCESS)
{
    //получаем ключ согласования импортом открытого ключа получателя на закрытый отправителя
    if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey,NULL,&hAgreeKey)) // собственно здесь я получаю ошибку 
    {
    
    }
}


Сертификат который я мспользую в качестве сертификата получателя во вложении:
EncryptRecipient.zip (2kb) загружен 5 раз(а).

Вопрос в том - что не так с этим сертификатом.
Или возможно у меня ошибка при получении блоба сертификата?

Отредактировано пользователем 29 октября 2015 г. 15:17:05(UTC)  | Причина: Не указана

Online Андрей Писарев  
#2 Оставлено : 29 октября 2015 г. 13:56:05(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,334
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2210 раз в 1725 постах
0x80090019 (-2146893799) набор ключей не определен
КриптоПРО CSP\Сервис\Протестировать\По сертификату - указать сертификат получателя зашифрованных данных.
результаты какие?
Техническую поддержку оказываем тут
Наша база знаний
Offline Svetovidov  
#3 Оставлено : 29 октября 2015 г. 14:43:05(UTC)
Svetovidov

Статус: Участник

Группы: Участники
Зарегистрирован: 08.10.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Никаких.
Потому как контейнера закрытого ключа для сертификата получателя нету в системе.
Видимо я криво объяснил, прошу прощения.
Я пытаюсь зашифровать сообщение парой ключей - закрытый ключ отправителя - открытый получателя.
Закрытый ключ отправителя читается, он есть в системе, с ним все в порядке.
В качестве открытого ключа получателя я подсовываю тестовый сертификат, закрытый ключ от которого расположен на носителе РутокенЭЦП (КриптоПро о нем ничего не знает) и получаю эту ошибку.

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

Online Андрей Писарев  
#4 Оставлено : 29 октября 2015 г. 14:48:07(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,334
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2210 раз в 1725 постах
Что мешает сделать тестовый себе?
Техническую поддержку оказываем тут
Наша база знаний
Offline Svetovidov  
#5 Оставлено : 29 октября 2015 г. 14:50:24(UTC)
Svetovidov

Статус: Участник

Группы: Участники
Зарегистрирован: 08.10.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Что мешает сделать тестовый себе?


Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК.
Проблемы начинаются когда подкладываю тот сертификат который необходим.
Online Андрей Писарев  
#6 Оставлено : 29 октября 2015 г. 15:09:54(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,334
Мужчина
Российская Федерация

Сказал «Спасибо»: 550 раз
Поблагодарили: 2210 раз в 1725 постах
Автор: Svetovidov Перейти к цитате
Автор: Андрей * Перейти к цитате
Что мешает сделать тестовый себе?


Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК.
Проблемы начинаются когда подкладываю тот сертификат который необходим.


Цитата:

//получаем ключ согласования импортом открытого ключа отправителя на закрытый получателя
if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey


Пример на зашифрование файла
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Svetovidov оставлено 29.10.2015(UTC)
Offline Svetovidov  
#7 Оставлено : 29 октября 2015 г. 15:15:47(UTC)
Svetovidov

Статус: Участник

Группы: Участники
Зарегистрирован: 08.10.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
Автор: Svetovidov Перейти к цитате
Автор: Андрей * Перейти к цитате
Что мешает сделать тестовый себе?


Смысл. Если в качестве получателя используется сертификат криптоПро то все ОК.
Проблемы начинаются когда подкладываю тот сертификат который необходим.


Цитата:

//получаем ключ согласования импортом открытого ключа отправителя на закрытый получателя
if(m_pcryptoAPI->CryptImportKey(pbtPublicKeyBlob,nPublicKeyBlobSize,hSenderPrivateKey


Пример на зашифрование файла


Да, виноват. Комментарий конечно неправильный.
pbtPublicKeyBlob- Блоб открытого ключа получателя.
hSenderPrivateKey - Дескриптор закрытого ключа отправителя.
Собственно код процентов на 80% взят из вашего примера.

Отредактировано пользователем 29 октября 2015 г. 15:20:57(UTC)  | Причина: Не указана

Offline Svetovidov  
#8 Оставлено : 6 ноября 2015 г. 18:43:56(UTC)
Svetovidov

Статус: Участник

Группы: Участники
Зарегистрирован: 08.10.2015(UTC)
Сообщений: 14
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 1 раз
Собственно проблема была в том, что у ключей были разные параметры кривых.
Поэтому чтобы не зависеть от этого решил использовать эфемерные ключи, которые генерируются с теми же параметрами кривых что и открытый ключ получателя.
Код который делает это приведен ниже:
Код:

if(m_pcryptoAPI->CryptGenKey(ephem_key_algid,CRYPT_EXPORTABLE|CRYPT_PREGEN,&hEphemKey))
	{
		BYTE* pboid;
		DWORD dwOidLen;
		//Получаем OID KP_DHOID открытого ключа
		if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,106,NULL,&dwOidLen,NULL))
		{
			pboid=new BYTE[dwOidLen];
			if(pboid)
			{
				if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,106,pboid,&dwOidLen,NULL))
				{
					//устанавливаем это значение вновь сгенерированному ключу
					if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,106,pboid,NULL))
						dwError=GetLastError();
				}
				else
					dwError=GetLastError();
				delete [] pboid;
			}
			else
				dwError=E_OUTOFMEMORY;
		}
		else
			dwError=GetLastError();

		//Получаем значение OID KP_HASHOID открытого ключа
		if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,103,NULL,&dwOidLen,NULL))
		{
			pboid=new BYTE[dwOidLen];
			if(pboid)
			{
				if(m_pcryptoAPI->CryptGetKeyParam(hRecipientPublicKey,103,pboid,&dwOidLen,NULL))
				{
					//устанавливаем это значение вновь сгенерированному ключу
					if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,103,pboid,NULL))
						dwError=GetLastError();
				}
				else
					dwError=GetLastError();
				delete [] pboid;
			}
			else
				dwError=E_OUTOFMEMORY;
		}
		else
			dwError=GetLastError();

		if(!m_pcryptoAPI->CryptSetKeyParam(hEphemKey,14,NULL,0))
			dwError=::GetLastError();
	}
	else
		dwError=::GetLastError();
	}
//Ну и далее импорт ключа и шифрование данных, согласно примерам
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.