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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline bsivko  
#1 Оставлено : 24 сентября 2008 г. 2:12:35(UTC)
bsivko

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.09.2008(UTC)
Сообщений: 1
Мужчина
Откуда: Gomel, Belarus

Код:
	HCRYPTPROV hCryptoProvider = 0;
	HCRYPTKEY hPubKey = 0;
	HCRYPTHASH hHash = 0;

	if (use_machine_key)
		// Подключение к криптопровайдеру и получение 
		// указателя(hCryptoProvider) на ключесодержащее место в CSP.
		res = CryptAcquireContext( 
			&hCryptoProvider 
		,	m_container.c_str() 
		,	0 
		,	type() 
		,	CRYPT_MACHINE_KEYSET | CRYPT_SILENT 
		);
	else
		res = CryptAcquireContext( 
			&hCryptoProvider 
		,	m_container.c_str() 
		,	0 
		,	type() 
		,	CRYPT_SILENT 
		);

	res = CryptGetUserKey( hCryptoProvider, AT_SIGNATURE, &hPubKey ); 

	// Создание в системе хэш-объекта.
	res = CryptCreateHash(
		hCryptoProvider
	,	cert_alg_id()
	,	0
	,	unsigned int(0)
	,	&hHash
	);

	// Добавление данных к объекту хэш-функции.
	res = CryptHashData( 
		hHash
	,	reinterpret_cast {const BYTE *} ( body.c_str() ) 
	,	body.length() 
	,	0 
	);

	DWORD signature_length = 0;

	// Вычисление значения ЭЦП от значения хэша.
	res = CryptSignHash(
		hHash
	,	(unsigned int)AT_SIGNATURE
	,	NULL
	,	0
	// 0 - возврат в signature_length 
	// необходимого размера для подписи.
	,	0
	,	&signature_length
	);

	// Буфер для приема подписи.
	std::vector {BYTE} temp(signature_length);

	// Вычисление значения ЭЦП от значения хэша.
	res = CryptSignHash(
		hHash
	,	(unsigned int)AT_SIGNATURE
	,	NULL
	,	0
	,	&temp[0]
	,	&signature_length 
	);



Вышепредставленный код проверен для 2.0 (представлен без проверок ошибок).
Генерация : http://www.cryptopro.ru/certsrv/certrqma.asp, ключи находятся в контейнерах КриптоПро.

Версии:
2.0: 2.0 Build 2104, Win 2000
3.0: KC1 3.0.3300.3, Win Server 2003

После перехода на 3.0 на другой машине появилась проблема: при операции CryptGetUserKey ключ не находится (ошибка CryptGetUserKey - NTE_NO_KEY The key requested by the dwKeySpec parameter does not exist ).

После просмотра форумов и нахождения http://www.cryptopro.ru/...ro/forum/view.asp?q=6728 (последние сообщения) пришли к выводу, что замена AT_SIGNATURE -> AT_KEYEXCHANGE должна решить проблему. После замены функции отрабатывают, но в плане полной корректности уверенности нет.

В связи со всем этим есть 2 вопроса:
1) насколько такая реализация жизнеспособна для 3.0?
2) можно ли написать код, который был бы универсален для 2.0 и 3.0?

P.S. У вас форум не переваривает знаки больше/меньше (> <) внутри [ code ], там где vector и reinterpret_cast, пишет что
Цитата:
There has been a serious error loading the forum. No futher information is available.

Please contact the administrator if this message persists.

Отредактировано пользователем 24 сентября 2008 г. 2:21:37(UTC)  | Причина: Не указана

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