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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline al  
#1 Оставлено : 24 декабря 2014 г. 13:14:35(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Здравствуйте!
Мне нужно получить ключ, диверсифицированный по алгоритму из п.7 rfc4357,
чтобы пользоваться им впоследствии как симметричным ключом.
Исходный ключ, который подлежит диверсификации должен находится в долговременном хранилище.
Поэтому я создаю пару AT_KEYEXCHANGE (или AT_SIGNATURE).
Но следующий код не работает (асимметричный ключ не диверсифицируется):
Цитата:

//для примера
BYTE UKM[20]={
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,
0xA0,0xA1,0xA2,0xA3,0xA4,0xF6,0xE7,0xD8,0xC9,0xBA
};
BYTE blob[sizeof(CRYPT_DIVERSBLOB)+20];
CRYPT_DIVERSBLOB * Blob = (CRYPT_DIVERSBLOB*)blob;
Blob->DiversBlobHeader.BlobHeader.bType = DIVERSKEYBLOB;
Blob->DiversBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
Blob->DiversBlobHeader.BlobHeader.aiKeyAlg = CALG_G28147;
Blob->DiversBlobHeader.aiDiversAlgId = CALG_PRO_DIVERS;
Blob->DiversBlobHeader.dwDiversMagic = DIVERS_MAGIC;
Blob->DiversBlobHeader.cbDiversData = 20;
CopyMemory((LPBYTE)Blob->bDiversData,UKM,20);
if(!CryptImportKey(hProv, blob, sizeof(CRYPT_DIVERSBLOB)+20, hAsymKey, 0, &hSymDiversKey))HandleError("Diversify error");


Функция импорта возвращает: NTE_BAD_TYPE : "Тип ключевого блоба не поддерживается этим криптопровайдером и, возможно, ошибочен".

На всякий случай, AsymKey получен кодом:
Цитата:

if(!CryptAcquireContext(
&hProv,
cont_name,
NULL,
PROV_GOST_2001_DH,
CRYPT_NEWKEYSET)
) {
HandleError("Could not create Key Container");
}
printf( "Key Container %s created\n", cont_name);
if(!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hAsymKey)){
HandleError("Could not create AsymKey");
}
printf( "AsymKey in container %s created\n", cont_name);


В тоже время, если я устанавливаю в контейнер симметричный ключ (CALG_G28147) и диверсифицирую его кодом, приведенным выше, то всё работает.

Но вся проблема в том, что исходный ключ должен находиться в долговременном хранилище, а симметричные и эфемеральные асимметричные в долговременном хранилище не хранятся.

Подскажите, пожалуйста, что я делаю не так ?
Может быть надо установить какие-то атрибуты исходному (hAsymKey) ключу перед вызовом CryptImportKey ?

Всё это нам нужно для того, чтобы получать хендлы диверсифицированных ключей из CryptoPro HSM (сейчас строим макет на CryptoPro CSP 3.6).

Да, забыл сказать, что контейнер я создаю на машине (т.е.
LPCSTR cont_name="\\\\.\\hdimage\\test_container").
И еще, под windows не проверял (если это важно).

Отредактировано пользователем 24 декабря 2014 г. 15:37:34(UTC)  | Причина: Не указана

Offline al  
#2 Оставлено : 24 декабря 2014 г. 16:29:01(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Или же единственный путь в моем случае, это экспортировать ключ (у меня AT_KEYEXCHANGE) из долговременного хранилища в PRIVATEKEYBLOB. Парзить эту структуру (еще бы знать её формат!), и вытаскивать из неё свой ключ в "зашифрованном" на ключе согласования виде (как я понимаю, сформированным по алгоритму из п.5.2 и 6.3 rfc4357). Считать это (32 байта) диверсифицированной версией, и устанавливать его в контейнер как симметричный (снабдив соответствующими атрибутами) на время работы программы. Просто в этом случае придется на каждую пару ключа из долговременного хранилища генерировать две пары ДХ (чтобы экспортировать сключ AT_XXXX в блоб). Причем, если ДХ-ключи эфемерные, то придется где-то заначивать как минимум "UKM" (ну а это уж совсем "ни в какие ворота").

Сотрудники Крипто Про, пожалуйста, помогите!
Offline Максим Коллегин  
#3 Оставлено : 25 декабря 2014 г. 14:05:04(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 721 раз в 625 постах
Самое правильное - хранить симметричный ключ, зашифрованным (экспортированным) на открытом. А при использовании расшифровывать с помощью закрытого.
Знания в базе знаний, поддержка в центре поддержки
Offline al  
#4 Оставлено : 25 декабря 2014 г. 19:35:00(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Спасибо.
maxdm, а правильны ли мои высказывания по поводу того,
что симметричный ключ, на чём бы он ни был зашифрован, в долговременном хранилище не сохраняется. Точно также не сохраняются в долговременном хранилище и эфемерные ключи,
которые я могу установить снаружи, например так:
Цитата:

CRYPT_DATA_BLOB blob;
//создаем "пустую пару"
CryptGenKey(hProv, CALG_DH_EL_EPHEM, CRYPT_PREGEN, &hKey);
//устанавливаем закрытый ключ
blob.cbData=SECRET_KEY_LEN;
blob.pbData=(LPBYTE)pbKey; //указатель на закрытый ключ
CryptSetKeyParam(hKey, KP_X, (LPBYTE)&blob, 0);


Т.е. правильно ли моё утверждение, что в долговременном хранилище могут быть сохранены только ключи типа AT_KEYEXCHANGE (или AT_SIGNATURE), Но они могут оказаться в долговременном хранилище только двумя способами: либо импортом PRIVATEKEYBLOB, либо генерацией пары.
И получить такой ключ из долговременного хранилища (контейнера в регистри, например) я могу только экспортом, в составе PRIVATEKEYBLOB. Это верно ?

Отредактировано пользователем 25 декабря 2014 г. 19:48:41(UTC)  | Причина: Не указана

Offline al  
#5 Оставлено : 25 декабря 2014 г. 20:01:35(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Я уточню. Мне нужно грубо говоря хранить свой симметричный мастер-ключ в контейнере КриптоПро.
Причем хранилище должно быть долговременным. Если в долговременном хранилище могут храниться только асимметричные пары AT_KEYEXCHANGE (или AT_SIGNATURE), то я говорю: "мой мастер-ключ - это прайвет пары" (разрядность одинакова). Я свой мастер-ключ в открытом виде использовать не собираюсь.
Более того, я его ни в каком виде не собираюсь извлекать из контейнера. Я хочу его диверсифицировать по п.7 rfc 4357, и пользоваться хендлом на диверсифицированный ключ (пользоваться им как симметричным ключом). Так вот, диверсифицировать кодом, приведенным в посте №1 асимметричный ключ не получается.
Вопрос, а возможно ли это в принципе ? (Да, и повторюсь, установленный снаружи симметричный ключ, диверсифицируется по п.7 rfc4357 "на ура". Но это мне не подходит - ключ должен быть не на время работы программы, а "на постоянном хранении" в контейнере).

Просто хотелось бы хранить симметричный ключ в самом HSM (а не "рядом" с ним, пусть даже в зашифрованном виде).

Отредактировано пользователем 25 декабря 2014 г. 20:14:48(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#6 Оставлено : 25 декабря 2014 г. 21:30:59(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 721 раз в 625 постах
Все верно понимаете. Есть еще несколько вариантов - сделать DH сам на себя и установить KP_ALGID 28147 или хранить экспортрованный ключ в расширении контейнера. Для HSM возможен еще один вариант uec symmetric:
​http://cpdn.cryptopro.ru/default.asp?url=content/csp39/html/group___pro_c_s_p_key_1g9fee2ab6b85c416c4534cf13fc150f29.html

Отредактировано пользователем 25 декабря 2014 г. 21:32:48(UTC)  | Причина: Не указана

Знания в базе знаний, поддержка в центре поддержки
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
al оставлено 25.12.2014(UTC)
Offline al  
#7 Оставлено : 25 декабря 2014 г. 22:18:35(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
Спасибо большое!
Надо будет осмыслить и попробовать!
Offline al  
#8 Оставлено : 8 мая 2015 г. 14:30:30(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
удалил пост, как не относящийся к тематике вопроса

Отредактировано пользователем 13 мая 2015 г. 8:22:10(UTC)  | Причина: удалил пост, как не относящийся к тематике вопроса

Offline al  
#9 Оставлено : 8 мая 2015 г. 14:56:10(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
удалил пост, как не относящийся к тематике вопроса

Отредактировано пользователем 13 мая 2015 г. 8:22:27(UTC)  | Причина: удалил пост, как не относящийся к тематике вопроса

Offline al  
#10 Оставлено : 8 мая 2015 г. 18:54:53(UTC)
al

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

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

Сказал(а) «Спасибо»: 16 раз
Поблагодарили: 1 раз в 1 постах
В предыдущих двух постах спрашивал про установку UKM на ключ согласования. Потом сам нашел ответ в http://cpdn.cryptopro.ru в разделе "Управление алгоритмами и параметрами RFC 4357 в СКЗИ КриптоПро CSP."
На самом деле, к основной тематике вопроса предыдущие два поста отношения не имели и я их удалил. Прошу прощения за привнесённую сумятицу.

Отредактировано пользователем 13 мая 2015 г. 8:28:50(UTC)  | Причина: Не указана

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