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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Владимир  
#1 Оставлено : 29 февраля 2008 г. 17:01:21(UTC)
Владимир

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

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

Приветствую.

Есть задача - с помощью CSP реализовать часть хэндшейка по ГОСТовому TLS.
А именно, мне надо получить зашифрованный пре-мастер секрет на своем закрытом ключе и открытом ключе сервера.

Сначала я пытался сделать как описано здесь:
http://www.cryptopro.ru/...pro/forum/view.asp?q=489

Но, судя по всему, этот вариант мне не подходит - сервер не может расшифровать ключ.(говорит MAC плохой)

Попытался вместо генерации CALG_G28147 сгенерить CALG_TLS1_MASTER.
Но в этом случае, при вызове функции CryptExprtKey возвращается ошибка NTE_BAD_KEY.

Попытался перед экспортом с помощью CryptSetKeyParam установить KP_CLIENT_RANDOM и KP_SERVER_RANDOM (на сколько я понимаю они используются при создании зашифрованного пре-мастер секрета). Результат тот же.

Никакой документации по этому вопросу найти не удалось.

Может подскажете, что делаю не так?

Offline Григорий Чудов  
#2 Оставлено : 29 февраля 2008 г. 20:50:04(UTC)
Григорий Чудов

Статус: Эксперт

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

Реализовать с помощью CSP часть хэндшейка TLS - это задача чуть более сложная чем просто экспорт сессионного ключа. Вы на верном пути, но путь этот долог :) Готовая реализация TLS входит в комплект CSP, поэтому если вас устраивает она - рекомендуется воспользоваться интерфейсом SSPI. Вся необходимая документация для этого имеется. Если же вы хотите чего-то экзотического, то боюсь готовой подробной документации по использованию CSP для реализации TLS не существует - хотя каждый отдельный вызов CSP, использующийся для этого, документирован.

На конкретные вопросы ответы таковы: Во первых, приведённый по ссылке алгоритм обмена не полон. Необходимо еще согласовать UKM, параметры алгоритма ключа и алгоритм обмена. Где-то в документации это должно было быть описано полностью.
Вкратце в этой цепочке не хватает следующих вызовов (помеченых восклицательным знаком):

CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPGenKey(hProv, CALG_TLS1_MASTER, CRYPT_EXPORTABLE, &hSessionKey);
CPImportKey(hProv, pbRecipentPublicKey, cbRecipentPublicKey, hUserKey, 0, &hExchKey);
/* ! */ CPSetKeyParam (hProv, hExchKey, KP_ALGID, (LPBYTE)&ke_alg, 0 ); /* ALG_ID ke_alg = CALG_SIMPLE_EXPORT; - Алгоритм simple key wrap */
/* ! */ CPSetKeyParam (hProv,hExchKey, KP_SV, ukm, 0); /* Задаём UKM. */
CPExportKey(hProv, hSessionKey, hExchKey, SIMPLEBLOB, 0, pbSessionKeyForRecipient, &cbSessionKeyForRecipient);

В случае если параметры ключей сторон не совпадают, то используется эфемеральный ключ. Т.е. вместо CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey) мы должны сгенерировать эфемеральный ключ с параметрами, такими же как у получателя. Делается это так:
CPGenKey (hProv, pubKeyAlgId, CRYPT_EXPORTABLE | CRYPT_PREGEN, &hUserKey);
CPSetKeyParam (hProv, hUserKey, KP_DHOID, (LPBYTE) recipient_public_key_parameters.publicKeyParamSet, 0);
CPSetKeyParam (hProv, hUserKey, KP_HASHOID, (LPBYTE) recipient_public_key_parameters.digestParamSet, 0);
CPSetKeyParam (hProv,hUserKey, KP_X, NULL, 0);

Что касается ukm, то для TLS он вычисляется как первые 8 байт хэша от конкатенации client_random и server_random.

Что касается KP_CLIENT_RANDOM и KP_SERVER_RANDOM, то как описано в документации, они используются при преобразовании premaster_secret в master_secret, т.е. после описанного выше экспорта ключа.

CPSetKeyParam (hProv, hSessionKey, KP_CLIENT_RANDOM, client_random, 0);
CPSetKeyParam (hProv, hSessionKey, KP_SERVER_RANDOM, server_random, 0);
CPSetKeyParam (hProv, hSessionKey, KP_PREHASH, NULL, 0);

Когда дело дойдёт до выработки сессионных ключей из master_secret, обратите внимание на алгоритм хеша CALG_TLS1_MASTER_HASH. Именно с помощью него осуществляются данные операции. Вкратце, в master_secret повторно устанавливаются KP_CLIENT_RANDOM и KP_SERVER_RANDOM, потом производится CPCreateHash (hProv, CALG_TLS1_MASTER_HASH, hSessionKey, 0, &hMasterHash), потом из него получаются 2 пары ключей (шифрования/контроля целостности для чтения/записи), каждая примерно следующей последовательностью вызовов:
DWORD Flags = (мы сервер && ключ чтения) || (мы клиент && ключ записи) ? 0 : CRYPT_SERVER;
CPDeriveKey (hProv, CALG_TLS1_ENC_KEY, hMasterHash, Flags, &hKey);
CPSetKeyParam (hProv, hKey, KP_CIPHEROID, (LPBYTE)OID_CipherVerbaO, 0);
CPSetKeyParam (hProv, hKey, KP_MODE, (LPBYTE)&cipherMode, 0);
CPDeriveKey (hProv, CALG_TLS1_MAC_KEY, hMasterHash, Flags, &hHMACKey);
CPSetKeyParam (hProv, hHMACKey, KP_CIPHEROID, (LPBYTE)OID_CipherVerbaO, 0);
CPCreateHash (hProv, CALG_G28147_IMIT, hHMACKey, 0, &hHMACHash);
Offline Владимир  
#3 Оставлено : 4 марта 2008 г. 23:08:25(UTC)
Владимир

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

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

Спасибо! Все получилось!

Я думал об использовании SSPI, но мне показалось что он слишком высокоуровневый для моей задачи.
К тому же я с ним никогда не работал, а с CSP у меня небольшой опыт работы уже есть.
Offline sushev_a_a  
#4 Оставлено : 14 февраля 2017 г. 14:19:08(UTC)
sushev_a_a

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

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

Сказал(а) «Спасибо»: 3 раз
добрый день.
разбираюсь с TLS. получилось создать ключи и выполнить шифрование, как описано в этой ветке.
но появилось несколько вопросов.

насколько сейчас актуален описанный здесь способ? а то ветке 9 лет)
реальная реализация TLS в криптопро работает таким же образом? для TLS_GOSTR341112_256_WITH_28147_CNT_IMIT

как при данном способе получить вектор инициализации IV? просто как первые 8 байт UKM?

и ещё. в списке алгоритмов есть CALG_TLS1PRF_2012_256. он ведь тоже позволяет создать ключи из общего секрета.
в каких случаях тогда используется CALG_TLS1PRF_2012_256 и в каких CALG_TLS1_MASTER_HASH_2012_256?
Offline sushev_a_a  
#5 Оставлено : 16 февраля 2017 г. 11:04:33(UTC)
sushev_a_a

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

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

Сказал(а) «Спасибо»: 3 раз
up
Offline svs  
#6 Оставлено : 17 февраля 2017 г. 9:36:11(UTC)
svs


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

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

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

Порядок работы описан в документе, утвержденном ТК 26: http://tc26.ru/methods/r...on/%D0%A2%D0%9A26TLS.pdf

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