logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline PPP  
#1 Оставлено : 7 августа 2017 г. 18:56:17(UTC)
PPP

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

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

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

В примере на зашифрование файла в документе "СКЗИ КриптоПро CSP. Руководство программиста Часть 1":
Перед зашифрованием сессионного ключа (ключа алгоритма ГОСТ 28147-89) на ключе согласования (keyAgree) выполняется установка алгоритма экспорта сессионного ключа с помощью функции CryptSetKeyParam:
CryptSetKeyParam(keyAgree, KP_ALGID, CALG_PRO_EXPORT,0).


Если я правильно понимаю, реализация алгоритма экспорта ключа реализована в соответствии с пунктом 6 "Key Wrap Algorithms" RFC4357.

Однако в пункте 6 RFC4357 представлено два алгоритма экспорта ключа: GOST 28147-89 Key Wrap и CryptoPro Key Wrap.

Какому из этих алгоритмов соответствует идентификатор CALG_PRO_EXPORT?


С уважением,
Павел

Отредактировано пользователем 8 августа 2017 г. 10:08:39(UTC)  | Причина: Не указана

Offline PPP  
#2 Оставлено : 8 августа 2017 г. 12:19:51(UTC)
PPP

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

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

Сказал(а) «Спасибо»: 8 раз
В дополнение к предыдущему вопросу...

Для выработки ключа согласования (KeyAgree) используется функция CryptImportKey на вход которой подаются открытый ключ получателя и закрытый ключ отправителя.

Согласно алгоритму VKO GOST R 34.10-2001 (rfc4357) для выработки ключа согласования (в rfc он называется KEK - key encryption key) требуются следующие данные:
- открытый ключ получателя;
- закрытый ключ отправителя;
- UKM (не нулевое целое число, произведенное в соответствии с шагом 2, пункта 6.1, non-zero integer, GOSTR341001).

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

Вопросы:

UKM вырабатывается автоматически в функции CryptImportKey или его надо вырабатывать отдельно?

Если UKM вырабатывается отдельно, то как его передать в функцию CryptImportKey, что бы он использовался при выработке ключа согласования?


С уважением,
Павел
Offline PPP  
#3 Оставлено : 11 августа 2017 г. 9:20:45(UTC)
PPP

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

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

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


Кто-нибудь сможет ответить на ранее озвученные вопросы?
Offline svs  
#4 Оставлено : 14 августа 2017 г. 17:20:25(UTC)
svs


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

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

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

Прошу прощения за задержку с ответом.

Ответы на эти (и аналогичные) вопросы мы постарались привести в следующем разделе нашей документации: Управление алгоритмами и параметрами RFC 4357.

1) CALG_PRO_EXPORT соответствует CryptoPro Key Wrap.
2) При экспорте UKM, если он не был задан явным образом с помощью отдельного SetKeyParam, создается случайным. При импорте UKM, если он не был задан явным образом с помощью отдельного SetKeyParam, берется из блоба.

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

С уважением,
Станислав Смышляев, к.ф.-м.н.,
Начальник отдела защиты информации ООО "КРИПТО-ПРО"
thanks 1 пользователь поблагодарил svs за этот пост.
PPP оставлено 16.08.2017(UTC)
Offline PPP  
#5 Оставлено : 14 августа 2017 г. 18:37:51(UTC)
PPP

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

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

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

1. По первому вопросу ответ понятен.

2. По второму вопросу:

Выработка ключа согласования (алгоритм VKO GOST R 34.10-2001) как при зашифровании данных, так и при расшифровании осуществляется с помощью функции CryptImportKey.
Входными параметрами данной функции являются:
1) дескриптор криптопровайдера;
2) открытый ключ получателя (отправителя);
3) дескриптор закрытого ключа отправителя (получателя).

Выходным параметром является:
- дескриптор ключа согласования.

Никакая информация из блоба при расшифровании данных (выработке ключа согласования на стороне получателя) в данную функцию не подается.
Это говорит о том, что при выработке ключа согласования UKM не используется, либо всегда используется постоянное значение UKM.


Примечание: в примере на расшифрование файла в документе "СКЗИ КриптоПро CSP. Руководство программиста Часть 1", блоб содержащий UKM, передается в функцию импорта сессионного ключа, но не в функцию выработки ключа согласования.


Поправьте меня если я не прав. Прошу пояснить как функцию CryptImportKey (реализующую VKO GOST R 34.10-2001)передать блоб, содержащий UKM.


С уважением,
Павел
Offline Grey  
#6 Оставлено : 15 августа 2017 г. 11:08:40(UTC)
Grey


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

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

Поблагодарили: 22 раз в 20 постах
Автор: PPP Перейти к цитате
Станислав, добрый день!

1. По первому вопросу ответ понятен.

2. По второму вопросу:

Выработка ключа согласования (алгоритм VKO GOST R 34.10-2001) как при зашифровании данных, так и при расшифровании осуществляется с помощью функции CryptImportKey.
Входными параметрами данной функции являются:
1) дескриптор криптопровайдера;
2) открытый ключ получателя (отправителя);
3) дескриптор закрытого ключа отправителя (получателя).

Выходным параметром является:
- дескриптор ключа согласования.

Никакая информация из блоба при расшифровании данных (выработке ключа согласования на стороне получателя) в данную функцию не подается.
Это говорит о том, что при выработке ключа согласования UKM не используется, либо всегда используется постоянное значение UKM.


Примечание: в примере на расшифрование файла в документе "СКЗИ КриптоПро CSP. Руководство программиста Часть 1", блоб содержащий UKM, передается в функцию импорта сессионного ключа, но не в функцию выработки ключа согласования.


Поправьте меня если я не прав. Прошу пояснить как функцию CryptImportKey (реализующую VKO GOST R 34.10-2001)передать блоб, содержащий UKM.


С уважением,
Павел


Добрый день!

В функцию CryptImportKey передать UKM нельзя.

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

Если же ключ обмена используется не для шифрования сессионных ключей, то явно передать UKM можно так:
CryptGetKeyParam(hKey1, KP_IV)
CryptSetKeyParam(hKey2, KP_IV)
С уважением,
Сергей Агафьин,
Ведущий инженер-программист, компания "КриптоПро"
Offline PPP  
#7 Оставлено : 15 августа 2017 г. 11:46:55(UTC)
PPP

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

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

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

Попытался явно установить UKM в дескриптор закрытого ключа. Функция CryptSetKeyParam вернула ошибку 8009000A (Bad data). Ниже привожу фрагмент исходного текста:


Код:

//*******************Set_UKM********************
	byte pbIV2[8] = {0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
	
	if(CryptSetKeyParam(
            hKey,  // Дескриптор закрытого ключа отправителя
            KP_IV, 
            pbIV2, 
            0)) 
	{
		printf("The UKM has been set. \n");
    }
    else
    {
		DWORD lstErr = GetLastError();
		HandleError("Error UKM.");
    }

	//*******************End Set_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.");
    }


Что делаю не так? Как правильно установить UKM?
Offline Grey  
#8 Оставлено : 15 августа 2017 г. 11:51:50(UTC)
Grey


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

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

Поблагодарили: 22 раз в 20 постах
Автор: PPP Перейти к цитате
Коллеги, добрый день!

Попытался явно установить UKM в дескриптор закрытого ключа. Функция CryptSetKeyParam вернула ошибку 8009000A (Bad data). Ниже привожу фрагмент исходного текста:


Что делаю не так? Как правильно установить UKM?


Добрый день.
Его нужно устанавливать на ключ обмена.
С уважением,
Сергей Агафьин,
Ведущий инженер-программист, компания "КриптоПро"
Offline PPP  
#9 Оставлено : 15 августа 2017 г. 12:11:55(UTC)
PPP

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

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

Сказал(а) «Спасибо»: 8 раз
Согласно пункту 5.2 "VKO GOST R 34.10-2001" RFC4357 ключ шифрования ключей (в нашем случае ключ согласования) вычисляется по следующему алгоритму:

1) Let K(x,y,UKM) = ((UKM*x)(mod q)) . (y.P) (512 bit), где
x – закрытый ключ отправителя (256 bit)
x.P – открытый ключ отправителя (512 bit)
y - закрытый ключ получателя (256 bit)
y.P - открытый ключ получателя (512 bit)
UKM – не нулевое целое число, produced as in step 2 p. 6.1 [GOSTR341001]
P - base point on the elliptic curve (two 256-bit coordinates)
UKM*x - x multiplied by UKM as integers
x.P - a multiple point
2) Вычисление хэш-значения длиной 256 бит от K(x,y,UKM):
KEK(x,y,UKM) = gostR3411 (K(x,y,UKM))

Ключевые пары (x,x.P) и (y,y.P) ДОЛЖНЫ соответствовать [GOSTR341001].

Данный алгоритм НЕ ДОЛЖЕН использоваться когда x.P = P, y.P = P


Вопросы:

Если я буду устанавливать UKM в ключ обмена, то что (применительно к описанному выше алгоритму VKO):
а) будет делать функция CryptImportKey(hProv, pbKeyBlob, dwBlobLen, hKey, 0, &hAgreeKey))?
б) будет представлять выходной параметр "hAgreeKey" функции CryptImportKey
в) будет делать функция CryptSetKeyParam(hAgreeKey, KP_IV, pbIV2, 0))?
г) Возможно ли формулу "Let K(x,y,UKM) = ((UKM*x)(mod q)) . (y.P) (512 bit)" разбить на две функции: CryptImportKey и CryptSetKeyParam?
Offline Grey  
#10 Оставлено : 15 августа 2017 г. 12:22:25(UTC)
Grey


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

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

Поблагодарили: 22 раз в 20 постах
Автор: PPP Перейти к цитате

Вопросы:

Если я буду устанавливать UKM в ключ обмена, то что (применительно к описанному выше алгоритму VKO):
а) будет делать функция CryptImportKey(hProv, pbKeyBlob, dwBlobLen, hKey, 0, &hAgreeKey))?
б) будет представлять выходной параметр "hAgreeKey" функции CryptImportKey
в) будет делать функция CryptSetKeyParam(hAgreeKey, KP_IV, pbIV2, 0))?
г) Возможно ли формулу "Let K(x,y,UKM) = ((UKM*x)(mod q)) . (y.P) (512 bit)" разбить на две функции: CryptImportKey и CryptSetKeyParam?


а) Можно сказать (это в реальности не совсем так, но как модель подходит), что она сделает структуру из трех полей: {ключ, открытый ключ, UKM}.
б) Хэндл этой структуры.
в) Переписывает поле UKM этой структуры.
г) CryptImportKey и CryptSetKeyParam(KP_IV) задают для данного выражения входные значения. Само вычисление выполняется атомарно (вместе с хэшированием) в момент, когда ключ реально требуется. Тогда hAgreeKey превратится в хэндл настоящего объекта ключа.
С уважением,
Сергей Агафьин,
Ведущий инженер-программист, компания "КриптоПро"
Offline PPP  
#11 Оставлено : 15 августа 2017 г. 17:04:35(UTC)
PPP

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

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

Сказал(а) «Спасибо»: 8 раз
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 pd  
#12 Оставлено : 15 августа 2017 г. 19:20:53(UTC)
pd


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

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

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 50 раз в 44 постах
Автор: 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)
Сообщений: 35
Российская Федерация
Откуда: Москва

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

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

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 Grey  
#14 Оставлено : 16 августа 2017 г. 14:27:11(UTC)
Grey


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

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

Поблагодарили: 22 раз в 20 постах
Автор: 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)
Сообщений: 35
Российская Федерация
Откуда: Москва

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