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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline i25061  
#1 Оставлено : 18 ноября 2013 г. 10:50:25(UTC)
i25061

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

Группы: Участники
Зарегистрирован: 09.03.2011(UTC)
Сообщений: 28
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Устанавливаем КриптоПро CSP 3.6: версия ядра СКЗИ: 3.6.5364 КС1, версия продукта: 3.6.7491
Неважно на 32-х битную вннду или 64-х битную.
Устанавливаем в хранилище MY текущего пользователя тестовый сертификат testcert, алгоритм подписи ГОСТ Р 34.11/34.10-2001. Я брал его с тестового УЦ компании КриптоПро.
Запускаем такую программу
Код:

#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <WincryptEx.h>
#include <stdio.h>

HCERTSTORE CertificateStore;
PCCERT_CONTEXT CertificateContext=NULL;

int _tmain(int argc, _TCHAR* argv[])
{
	HCRYPTPROV CryptoProvider;
	BOOL isGetCryptoProvider=FALSE;
	DWORD TypeKey;
	BOOL b;

	CertificateStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0,	NULL, CERT_SYSTEM_STORE_CURRENT_USER, L"MY");
	CertificateContext = CertFindCertificateInStore(CertificateStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR, L"testcert", NULL );
	isGetCryptoProvider = CryptAcquireCertificatePrivateKey(CertificateContext, 0, NULL, &CryptoProvider, &TypeKey, &b);
	if(!isGetCryptoProvider)
	{
		printf( "CryptAcquireCertificatePrivateKey\n" );
		exit(1);
	}
	HCRYPTKEY SessionKey = NULL;
	BOOL isCreateSessionKey = CryptGenKey(CryptoProvider, CALG_G28147, CRYPT_EXPORTABLE, &SessionKey);
	if(!isCreateSessionKey)
	{
		printf( "CryptGenKey\n" );
		exit(1);
	}

	BYTE *pbData;
	DWORD dwDataLen;
	BYTE data[1024];
	for( int i=0; i < 50000; i++ )
	{
		memset( data, ' ', 1024 );
		BOOL isGetIV = CryptGetKeyParam(SessionKey, KP_IV, NULL, &dwDataLen, 0);
		if(!isGetIV)
		{
			printf( "CryptGetKeyParam - size\n" );
			exit(1);
		}
		pbData = (BYTE*)malloc(dwDataLen);
		isGetIV = CryptGetKeyParam(SessionKey, KP_IV, pbData, &dwDataLen, 0);
		if(!isGetIV)
		{
			printf( "CryptGetKeyParam - data\n" );
			exit(1);
		}

		BOOL isEncrypt = CryptEncrypt(SessionKey, 0, TRUE, 0, data, &dwDataLen, 1024);
		if( !isEncrypt )
		{

			printf( "CryptEncrypt i=%d GetLastError()=%u\n", i, GetLastError() );
			exit(1);
		}
		free( pbData );
	}

	CryptReleaseContext( CryptoProvider, 0 );
	CertFreeCertificateContext( CertificateContext );
	CertCloseStore(CertificateStore,CERT_CLOSE_STORE_FORCE_FLAG);
	printf( "Success!\n" );
	return 0;
}

Получаем вывод на консоль:
CryptEncrypt i=4097 GetLastError()=2148073475
И почему так? Причём здесь NTE_BAD_KEY на 4097-й итерации?

Устанавливаем КриптоПро CSP 3.6: версия ядра СКЗИ: 3.6.5364 КС1, версия продукта: 3.6.6796
Запускаем ту же программу.
Получаем вывод на консоль:
Success!
С этим всё понятно, так и должно быть.
Но в 3.6.7491...???
Offline Максим Коллегин  
#2 Оставлено : 18 ноября 2013 г. 12:01:49(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Ограничение нагрузки на ключ.
Знания в базе знаний, поддержка в техподдержке
Offline i25061  
#3 Оставлено : 18 ноября 2013 г. 12:23:09(UTC)
i25061

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

Группы: Участники
Зарегистрирован: 09.03.2011(UTC)
Сообщений: 28
Мужчина
Откуда: Екатеринбург

Сказал «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: maxdm Перейти к цитате
Ограничение нагрузки на ключ.

С целью затруднения атак на сессионный ключ?

Offline Максим Коллегин  
#4 Оставлено : 18 ноября 2013 г. 14:13:56(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Да, требования ФСБ. 4 Мегабайта или 4096 операций финализации ключа.
Знания в базе знаний, поддержка в техподдержке
Offline Ur-Quan  
#5 Оставлено : 27 февраля 2014 г. 13:54:43(UTC)
Ur-Quan

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

Группы: Участники
Зарегистрирован: 27.08.2010(UTC)
Сообщений: 5
Откуда: Москва

Скажите, пожалуйста, каков рекомендуемый алгоритм поведения в случаях, когда требуется проводить более 4096 операций? Например, при шифровании канала между клиентом и сервером. Нужно включать счётчик операций и менять ключ по достижении этого числа? Или у криптопровайдера этот параметр можно запросить?

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