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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vl2019  
#1 Оставлено : 10 июня 2015 г. 17:35:28(UTC)
vl2019

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

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

Сказал(а) «Спасибо»: 1 раз
Имеется зашифрованный ключ по RFC 4490 п.4.2.1
и сообщение, зашифрованное этим ключем по алгоритму GOST 28147-89.


Например, в RFC 4357 п.5.2 описан алгоритм получения ключа (KEK).
Какие шаги необходимо выполнить в КриптоПро для расшифровки этого сообщения?
Используется CAPILite в Linux.

Отредактировано пользователем 17 июня 2015 г. 17:45:10(UTC)  | Причина: Не указана

Offline Станислав Смышляев  
#2 Оставлено : 15 июня 2015 г. 7:43:29(UTC)
Станислав Смышляев

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

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

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

Процедура выработки ключа KEK в соответствии с RFC 4357 зафиксирована в документации (ссылка).
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline vl2019  
#3 Оставлено : 16 июня 2015 г. 15:18:07(UTC)
vl2019

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

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

Сказал(а) «Спасибо»: 1 раз
Делаю следующее:
Код:

//Собираю CRYPT_SIMPLEBLOB из зашифрованного сессионного ключа.
BYTE pbKeyBlobSimple[71]; 
//Собираю CRYPT_SIMPLEBLOB из эфемерного ключа.
BYTE bEphemeralPublicKeySimple[100]; 

// Получаю дескриптор контейнера криптопровайдера
CryptAcquireContext(&hProv, __CONTAINER_NAME__, NULL, PROV_GOST_2001_DH, 0); 
//Получаю дескриптор закрытого ключа
CryptGetUserKey(hProv,AT_KEYEXCHANGE, &hKey); 

/* Что дальше делать не совсем понятно, делаю так: */

// Получение ключа согласования импортом эфемерного ключа отправителя 
// на ключе получателя.
CryptImportKey(hProv, &bEphemeralPublicKeySimple, 100, hKey, 0, &hAgreeKey);

// Установление алгоритма ключа согласования
ALG_ID alg = CALG_G28147; 
CryptSetKeyParam(hAgreeKey,KP_ALGID,(LPBYTE)&alg,0));

// Получение сессионного ключа импортом зашифрованного сессионного ключа на ключе Agree.
// В этот момент выходит ошибка 0x80090003.
CryptImportKey(hProv,&pbKeyBlobSimple, 71, hAgreeKey, 0, &hSessionKey); 

/* Расшифровка сообщения */
// Задаем вектор IV
CryptSetKeyParam(hSessionKey,KP_IV,bUKM,0);
// Расшифровываем.
CryptDecrypt(hSessionKey, 0, bFinal, 0, pbContent, &cbContent);

Может я пропустил какой-то шаг?
Offline Станислав Смышляев  
#4 Оставлено : 16 июня 2015 г. 15:50:07(UTC)
Станислав Смышляев

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Ошибка у Вас в установке параметра KP_IV. Вы фиксируете алгоритм ключа без сохранения значения UKM.
Пришлите, пожалуйста, также код экспорта ключа (формирования блоба), укажу наиболее простой для Вас вариант исправления (их несколько).

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

С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline vl2019  
#5 Оставлено : 16 июня 2015 г. 16:01:23(UTC)
vl2019

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

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

Сказал(а) «Спасибо»: 1 раз
Блоб формирую из ASN1 структуры GostR3410-KeyTransport:
Код:

//    0 30  164: SEQUENCE {
//    3 30   40:  SEQUENCE {
//    5 04   32:   OCTET STRING
//             :    36 4b 75 5b 9f d6 81 a5 58 2c c3 db fe 80 25 f1
//             :    8f 2d 71 66 65 8f 45 64 6b 84 69 bd d3 b3 a7 61
//   39 04    4:   OCTET STRING
//             :    10 27 fd a8
//             :  }
//   45 a0  120:  [0] {
//   47 06    7:   OBJECT IDENTIFIER id-Gost28147-89-CryptoPro-A-ParamSet (1.2.643.2.2.31.1)
//   56 a0   99:   [0] {
//   58 30   28:    SEQUENCE {
//   60 06    6:     OBJECT IDENTIFIER id-GostR3410-2001 (1.2.643.2.2.19)
//   68 30   18:     SEQUENCE {
//   70 06    7:      OBJECT IDENTIFIER id-GostR3410-2001-CryptoPro-XchA-ParamSet (1.2.643.2.2.36.0)
//   79 06    7:      OBJECT IDENTIFIER id-GostR3411-94-CryptoProParamSet (1.2.643.2.2.30.1)
//             :     }
//             :    }
//   88 03   67:    BIT STRING, unused 0 bits, encapsulates {
//   90 04   64:     OCTET STRING
//             :      30 5f e1 62 e0 98 89 d1 0f 9a a8 84 16 43 0a 0e
//             :      73 9a 4e d2 6b d9 91 a7 e6 a7 0c 0a 27 5b e6 53
//             :      57 8f 6f 35 cf 4a 42 37 2a 90 30 07 61 d0 01 4b
//             :      37 84 cc 82 b4 e2 0e 30 87 05 c9 35 fb 91 8d 29
//             :    }
//             :   }
//  157 04    8:   OCTET STRING
//             :    5c 1a e9 6a ad 97 d5 84
//             :  }
//             : }

Код:

    BYTE bEncryptionParamSetStandart[] = {
        0x30, 0x09, // SEQUENCE (размер 0x09)
        0x06, 0x07, // OBJECT IDENTIFIER,  (размер 0x07)
        0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 // 1.2.643.2.2.31.1
    };
    BYTE *pbKeyBlobSimple = NULL;
    DWORD dwBlobLenSimple;
    dwBlobLenSimple = (sizeof(CRYPT_SIMPLEBLOB_HEADER)+SEANCE_VECTOR_LEN+G28147_KEYLEN+EXPORT_IMIT_SIZE) + sizeof(bEncryptionParamSetStandart);
    pbKeyBlobSimple = malloc(dwBlobLenSimple);

    CRYPT_SIMPLEBLOB_HEADER tSimpleBlobHeaderStandart;
    tSimpleBlobHeaderStandart.BlobHeader.aiKeyAlg = CALG_G28147;
    tSimpleBlobHeaderStandart.BlobHeader.bType = SIMPLEBLOB;
    tSimpleBlobHeaderStandart.BlobHeader.bVersion = BLOB_VERSION;
    tSimpleBlobHeaderStandart.BlobHeader.reserved = 0;
    tSimpleBlobHeaderStandart.EncryptKeyAlgId = CALG_G28147;
    tSimpleBlobHeaderStandart.Magic = G28147_MAGIC;

    CopyMemory(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bEncryptedKey, bEncryptedKey, G28147_KEYLEN);
    CopyMemory(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bEncryptionParamSet, bEncryptionParamSetStandart, sizeof(bEncryptionParamSetStandart));
    CopyMemory(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bMacKey, bMacKey, EXPORT_IMIT_SIZE);
    CopyMemory(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->bSV, bUKM, SEANCE_VECTOR_LEN);
    CopyMemory(&((CRYPT_SIMPLEBLOB*)pbKeyBlobSimple)->tSimpleBlobHeader, &tSimpleBlobHeaderStandart, sizeof(CRYPT_SIMPLEBLOB_HEADER));


Я так понимаю что SV = KP_IV = UKM
Offline Станислав Смышляев  
#6 Оставлено : 16 июня 2015 г. 16:28:00(UTC)
Станислав Смышляев

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Не совсем.

UKM - величина, необходимая для выработки ключа согласования. Если ее не поставить явно, она сгенерится случайно. Устанавливается она тоже с помощью KP_IV, но семантика у нее совершенно иная.

Правильные варианты следующие: либо поставить известный Вам UKM перед тем, как поставить ключу согласования KP_ALGID, либо не ставить его явно вовсе в случае ALG_ID CALG_SIMPLE_EXPORT (в чем у Вас также есть отличие), в этом случае он извлечется из блоба. Исчерпывающие примеры есть в документации, например, здесь: "Пример на расшифрование файла").
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline vl2019  
#7 Оставлено : 16 июня 2015 г. 17:12:45(UTC)
vl2019

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

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

Сказал(а) «Спасибо»: 1 раз
Установил ALG_ID CALG_SIMPLE_EXPORT.
UKM находится в CRYPT_SIMPLEBLOB->bSV
Выходит ошибка 0x80090005

Делаю по примерам.

У эфемерного ключа, когда собираем его в PUBLICKEYBLOB, параметры такие же как у открытого ключа?

Код:

    0x06, // bType = PUBLICKEYBLOB
    0x20, // bVersion = 0x20
    0x00, 0x00, // reserved
    0x23, 0x2E, 0x00, 0x00, // KeyAlg = ALG_SID_GR3410EL
    0x4D, 0x41, 0x47, 0x31, // Magic = GR3410_1_MAGIC
    0x00, 0x02, 0x00, 0x00, // BitLen = 512
    // bASN1GostR3410_94_PublicKeyParameters
    0x30, 0x12,
    0x06, 0x07,
    0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00,
    0x06, 0x07,
    0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01,
    [тут 64 байта эфемерного ключа]
Offline Станислав Смышляев  
#8 Оставлено : 17 июня 2015 г. 10:03:35(UTC)
Станислав Смышляев

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

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Да, при несоответствии параметров будет ошибка.

По 0x80090005 детектировать что-либо невозможно. Напишите мне на svs@cryptopro.ru – если перешлете отрезок кода, с ним разберусь, потом на форуме отпишусь, в чем была ошибка.
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
Offline Станислав Смышляев  
#9 Оставлено : 17 июня 2015 г. 15:00:26(UTC)
Станислав Смышляев

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

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

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