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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline DmitryB  
#1 Оставлено : 21 марта 2016 г. 17:02:42(UTC)
DmitryB

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

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

Сказал(а) «Спасибо»: 1 раз
Есть код (кривой, с unused variables и т.п.) для шифрования блока данных в драйвере шифрования диска.

Код:

/*!
	Функция зашифровывает блок данных.

	@param h_prov - дескриптор CSP
	@param key - дескриптор ключа шифрования
	@param iv - указатель на вектор инициализации
	@param data - указатель на данные
	@param len_data - размер данных

	@return TRUE в случае успеха, FALSE в случае неудачи
*/
BOOL csp_encrypt ( 
					   HCRYPTPROV h_prov,
					   HCRYPTKEY  key,
					   PBYTE	  iv,
					   PBYTE	  data,
					   DWORD	  len_data, 
					   u64			ind	// смещение данных на диске
					   )
{
	BOOL ret=FALSE;
	DWORD len_data_=len_data;


	DWORD num_sec=0;
	PBYTE cur_data=data;
	DWORD cur_sec=0;
	DWORD size_sec=512;
	DWORD enc_len=size_sec;

	HCRYPTKEY	hDupKey;
	u64		index = ind;

	if (hCSP == NULL) return FALSE;

	if (len_data >= 512)
	{
	  num_sec=len_data/size_sec;
	}
	else
	{
		num_sec=1;
		enc_len=len_data;
	}

	for (cur_sec=0; cur_sec < num_sec; cur_sec++, cur_data+=size_sec)
	{
		ret = hCSP->DuplicateKey(hCSP,h_prov, key,NULL,0,&hDupKey);

		ret = hCSP->SetKeyParam(hCSP,h_prov, hDupKey, KP_IV, &index, 0); // синхропосылка,  64-битный  элемент  данных
		
		ret = hCSP->Encrypt ( 
							hCSP,
							h_prov,
							hDupKey, //key,
							0,
							TRUE, // Final
							0,
							cur_data,
							&enc_len, 
							enc_len );
		
		
		if (ret)
		{
			DbgMsg ("CPEncrypt error. 0x%8.8X\n",ret);
			//return ret;
		}

		ret = hCSP->DestroyKey(hCSP,h_prov, hDupKey);

		index += 512;

	}
	return ret;	
}


Буфер шифруется кусками по 512 байт (это конечно затраты на лишние вызовы API).
В качестве синхропосылки используется смещение блока данных в байтах. Т.е. 0, 0x200, 0x400...
А как было бы "правильно" менять это значение, как оно меняется в процессе шифрования 512 байт? Например для первых 8-ми байт 0, для следующих 1, 2...?
Или 0, 8, 16... Или какие-то манипуляции с этим числом проводятся?
Offline DmitryB  
#2 Оставлено : 31 марта 2016 г. 11:22:27(UTC)
DmitryB

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

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

Сказал(а) «Спасибо»: 1 раз
Кто-нибудь может ответить? Требуется уточнить вопрос?
Offline Станислав Смышляев  
#3 Оставлено : 31 марта 2016 г. 11:59:13(UTC)
Станислав Смышляев

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Добрый день!

Такого рода вопросы относятся к области полноценного криптоанализа решения (и решения всегда обосновываются на этапе сертификационных испытаний конечного продукта), поэтому отвечу коротко:

Если не вдаваться в тонкости, то при шифровании в режиме CNT принципиальнейшим вопросом является следующий: уникальность IV. Обеспечивается ли она инкрементацией или более хитрым образом, вообще говоря, не важно. В режиме CFB (судя по всему, у Вас используется именно он) нужна псевдослучайность, в этом случае детерминированная выработка IV Вам не подойдет вовсе.

Отмечу также, что если Вы привязываете IV к номеру блока, то при перезаписи в тот же блок других данных, Вы получите проблему полного или частичного раскрытия информации без ключа - шифровать дважды на одном IV недопустимо.
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline DmitryB  
#4 Оставлено : 31 марта 2016 г. 13:07:27(UTC)
DmitryB

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

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

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

И еще, то с чего начинал, попробую спросить иначе. 2 случая - шифруется:
1) 1024 байт за 1 раз
2) 512 байт + 512 байт.
В в обоих случаях для начала задается например IV=0x00000000`00000000
Что надо задавать в качестве IV в случае (2) для второго блока 512 байт, чтобы результат был одинаковым?
Offline Станислав Смышляев  
#5 Оставлено : 1 апреля 2016 г. 16:09:44(UTC)
Станислав Смышляев

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

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

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

Насчет IV для продолжения шифрования.
- В случае режима CNT - значение будет зависеть от ключа, так что вопрос не вполне уместен.
- В случае режима CFB - предыдущий блок шифртекста.

Отредактировано пользователем 1 апреля 2016 г. 16:15:28(UTC)  | Причина: Не указана

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