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

Уведомление

Icon
Error

2 Страницы<12
Опции
К последнему сообщению К первому непрочитанному
Offline PPP  
#11 Оставлено : 15 августа 2017 г. 17:04:35(UTC)
PPP

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

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

Сказал(а) «Спасибо»: 11 раз
1) Ответ понятен.

2) Проверил функционально принудительное задание UKM на Ваших примерах зашифрования и расшифрования файлов, приведенных в документе "СКЗИ КриптоПро CSP. Руководство программиста Часть 1".

В данные примеры добавил функционал принудительного задания UKM (в остальной части примеры не изменялись). См. фрагменты кода:

а) Зашифрование файла (фрагмент кода установки UKM в ключ согласования):

Код:

// Получение ключа согласования импортом открытого ключа получателя
    // на закрытом ключе отправителя.

    if(CryptImportKey(
	hProv, 
	pbKeyBlob, 
	dwBlobLen, 
	hKey, 
	0, 
	&hAgreeKey))
    {
		printf("The responder public key has been imported. \n");
    }
    else
    {
		
		HandleError("Error during CryptImportKey public key.");
    }


	//*******************Set_UKM********************
	byte pbIV2[8] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
	
	if(CryptSetKeyParam(hAgreeKey, KP_IV, pbIV2, 0)) 
	{
		printf("The UKM has been set. \n");
    }
    else
    {
		HandleError("Error UKM.");
    }

	//*******************End Set_UKM***************

    // Установление PRO_EXPORT алгоритма ключа согласования
    if(CryptSetKeyParam(
        hAgreeKey,
        KP_ALGID,
        (LPBYTE)&ke_alg,
        0))
    {
	printf("PRO_EXPORT agree key algorithm has been set. \n");
    }
    else
    {
	HandleError("Error during CryptSetKeyParam agree key.");
    }


б) Расшифрование файла (фрагмент кода установки UKM в ключ согласования):

Код:

// Получение ключа согласования импортом открытого ключа отправителя 
    // на закрытом ключе получателя.
    if(CryptImportKey(
        hProv, 
        pbKeyBlob, 
        dwBlobLen, 
        hKey, 
        0, 
        &hAgreeKey))
    {
        printf("The sender public key has been imported. \n");
    }
    else
    {
        HandleError("Error during CryptImportKey public key.");
    }

	
	//*******************Set_UKM********************
	byte pbIV2[8] = {0x00, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA};
	
	if(CryptSetKeyParam(hAgreeKey, KP_IV, pbIV2, 0)) 
	{
		printf("The UKM has been set. \n");
    }
    else
    {
		HandleError("Error UKM.");
    }

	//*******************End Set_UKM***************

    // Установление PRO_EXPORT алгоритма ключа согласования
    if(CryptSetKeyParam(
        hAgreeKey,
        KP_ALGID,
        (LPBYTE)&ke_alg,
        0))
    {
        printf("PRO_EXPORT agree key algorithm has been set. \n");
    }
    else
    {
        HandleError("Error during CryptSetKeyParam agree key.");
    }


По результатам проверки установлено, что если при расшифровании задать значение UKM отличное от того, которое использовалось при зашифровании, либо его не задавать совсем, то файл расшифровывается корректно.

Почему так происходит?
Offline Дмитрий Пичулин  
#12 Оставлено : 15 августа 2017 г. 19:20:53(UTC)
pd

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

Группы: Администраторы
Зарегистрирован: 16.09.2010(UTC)
Сообщений: 1,449
Откуда: КРИПТО-ПРО

Сказал(а) «Спасибо»: 31 раз
Поблагодарили: 417 раз в 308 постах
Автор: PPP Перейти к цитате
По результатам проверки установлено, что если при расшифровании задать значение UKM отличное от того, которое использовалось при зашифровании, либо его не задавать совсем, то файл расшифровывается корректно.

Почему так происходит?


Автор: Grey Перейти к цитате
В функцию CryptImportKey передать UKM нельзя.

Он может попасть в контекст двумя путями.
1. Явная установка с помощью CryptSetKeyParam(KP_IV).
2. Прозрачная генерация при первой операции, где требуется использование ключа обмена. Например, при экспорте блоба с сессионным ключом. UKM, который использовался для экспорта, записывается в данный блоб и достаётся из него при импорте блоба в другой контекст.



Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил pd за этот пост.
PPP оставлено 16.08.2017(UTC)
Offline PPP  
#13 Оставлено : 16 августа 2017 г. 9:53:03(UTC)
PPP

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

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

Сказал(а) «Спасибо»: 11 раз
Коллеги, добрый день!

Т.е. исходя из выше сказанного можно сделать следующие выводы:

1) Функция CryptImportKey входными параметрами которой являются закрытый ключ получателя и открытый ключ отправителя (см. ниже фрагмент кода из примера КриптоПро на расшифрование файла) возвращает дескриптор структуры (параметр hAgreeKey), состоящей из следующих полей: закрытый ключ получателя, открытый ключ отправителя и UKM.

Код:

// Получение ключа согласования импортом открытого ключа отправителя 
    // на закрытом ключе получателя.
    if(CryptImportKey(
        hProv, 
        pbKeyBlob, 
        dwBlobLen, 
        hKey, 
        0, 
        &hAgreeKey))
    {
        printf("The sender public key has been imported. \n");
    }
    else
    {
        HandleError("Error during CryptImportKey public key.");
    }


2) В функции CryptImportKey (см. ниже фрагмент кода из примера КриптоПро на расшифрование файла), осуществляющей импорт зашифрованного сессионного ключа, выполняются следующие действия:
а) выработка ключа согласования по алгоритму VKO GOST R 34.10-2001 (в соответствии с пунктом 5.2 RFC4357);
б) импорт зашифрованного ключа по алгоритму CryptoPro Key Unwrap (в соответствии с пунктом 6.4 RFC4357).

Код:

if(CryptImportKey(
        hProv, 
        pbKeyBlobSimple, 
        71, 
        hAgreeKey, 
        0, 
        &hSessionKey))
    {
        printf("The session key has been imported. \n");
    }
    else
    {
        HandleError("Error during CryptImportKey session key.");
    }



Прошу подтвердить сделанные выводы или внести уточнения.

Offline Агафьин Сергей  
#14 Оставлено : 16 августа 2017 г. 14:27:11(UTC)
Grey

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

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

Сказал «Спасибо»: 5 раз
Поблагодарили: 215 раз в 174 постах
Автор: PPP Перейти к цитате
Коллеги, добрый день!

Т.е. исходя из выше сказанного можно сделать следующие выводы:

1) Функция CryptImportKey входными параметрами которой являются закрытый ключ получателя и открытый ключ отправителя (см. ниже фрагмент кода из примера КриптоПро на расшифрование файла) возвращает дескриптор структуры (параметр hAgreeKey), состоящей из следующих полей: закрытый ключ получателя, открытый ключ отправителя и UKM.

2) В функции CryptImportKey (см. ниже фрагмент кода из примера КриптоПро на расшифрование файла), осуществляющей импорт зашифрованного сессионного ключа, выполняются следующие действия:
а) выработка ключа согласования по алгоритму VKO GOST R 34.10-2001 (в соответствии с пунктом 5.2 RFC4357);
б) импорт зашифрованного ключа по алгоритму CryptoPro Key Unwrap (в соответствии с пунктом 6.4 RFC4357).

Прошу подтвердить сделанные выводы или внести уточнения.



Добрый день.
Если готовить об указанном вами примере, то примерно так.
В реальности, разумеется, при другой последовательности вызова функций данные утверждения могут быть как верными, так и нет.

Отредактировано пользователем 16 августа 2017 г. 14:37:38(UTC)  | Причина: Не указана

С уважением,
Сергей
Техническую поддержку оказываем здесь.
Наша база знаний.
thanks 1 пользователь поблагодарил Grey за этот пост.
PPP оставлено 16.08.2017(UTC)
Offline PPP  
#15 Оставлено : 16 августа 2017 г. 15:31:29(UTC)
PPP

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

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

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