logo Обзор КриптоПро NGate для защищённого доступа к корпоративным ресурсам
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 1 раз
Имеется следующая ASN.1 структура (зашифрованный сессионный ключ, https://tools.ietf.org/html/draft-chudov-cryptopro-cpxmldsig-04 п. 6.6)
Код:

SEQUENCE(2 elem)
  SEQUENCE(2 elem)
    OCTET STRING(32 byte) 5E70735F3698B4355B45037FA7CE0097115E45C6585994726642063F723AB49E
    OCTET STRING(4 byte) 8C860884
  [0](3 elem)
    OBJECT IDENTIFIER1.2.643.2.2.31.1
    [0](2 elem)
      SEQUENCE(2 elem)
        OBJECT IDENTIFIER1.2.643.2.2.19
        SEQUENCE(2 elem)
          OBJECT IDENTIFIER1.2.643.2.2.36.0
          OBJECT IDENTIFIER1.2.643.2.2.30.1
      BIT STRING(1 elem)
        OCTET STRING(64 byte) 2DC3FDF69C913DCCB653268E512F5EDDE41A5DB3583CDF6068F248A2B0B8DE7BC9AA20E3CF63DF5F395521E0A0DD853E0AAF44FA493CD54CA8048D1D9C4185FB
    OCTET STRING(8 byte) 76EEB46B1B1036EB


Как из этого правильно собрать структуру CRYPT_SIMPLEBLOB для расшифровки этого ключа функцией CryptImportKey?

При таком раскладе параметров выходит ошибка 0x80090005:
Код:

BYTE bEncryptionParamSetStandart[] = {0x30, 0x09, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01};

CRYPT_SIMPLEBLOB_HEADER tSimpleBlobHeader;
tSimpleBlobHeader.BlobHeader.aiKeyAlg = CALG_GR3410EL;
tSimpleBlobHeader.BlobHeader.bType = SIMPLEBLOB;
tSimpleBlobHeader.BlobHeader.bVersion = BLOB_VERSION;
tSimpleBlobHeader.BlobHeader.reserved = 0;
tSimpleBlobHeader.EncryptKeyAlgId = CALG_GR3410EL;
tSimpleBlobHeader.Magic = GR3410_1_MAGIC;

BYTE *pbKeyBlobSimple = NULL;
pbKeyBlobSimple->tSimpleBlobHeader = tSimpleBlobHeader
pbKeyBlobSimple->bSV = 76EEB46B1B1036EB
pbKeyBlobSimple->bEncryptedKey = 5E70735F3698B4355B45037FA7CE0097115E45C6585994726642063F723AB49E
pbKeyBlobSimple->bMacKey = 8C860884
pbKeyBlobSimple->bEncryptionParamSet = bEncryptionParamSetStandart

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

Offline vl2019  
#2 Оставлено : 21 мая 2015 г. 15:24:05(UTC)
vl2019

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

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

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

Код:

// GostR3410 KeyTransport
//
// HEX:
// 30 81 A4 30 28 04 20 5E  70 73 5F 36 98 B4 35 5B
// 45 03 7F A7 CE 00 97 11  5E 45 C6 58 59 94 72 66
// 42 06 3F 72 3A B4 9E 04  04 8C 86 08 84 A0 78 06
// 07 2A 85 03 02 02 1F 01  A0 63 30 1C 06 06 2A 85
// 03 02 02 13 30 12 06 07  2A 85 03 02 02 24 00 06
// 07 2A 85 03 02 02 1E 01  03 43 00 04 40 2D C3 FD
// F6 9C 91 3D CC B6 53 26  8E 51 2F 5E DD E4 1A 5D
// B3 58 3C DF 60 68 F2 48  A2 B0 B8 DE 7B C9 AA 20
// E3 CF 63 DF 5F 39 55 21  E0 A0 DD 85 3E 0A AF 44
// FA 49 3C D5 4C A8 04 8D  1D 9C 41 85 FB 04 08 76
// EE B4 6B 1B 10 36 EB

// ASN1
//  SEQUENCE(2 elem)
//      SEQUENCE(2 elem)
//          OCTET STRING(32 byte) 5E 70 73 5F 36 98 B4 35 5B 45 03 7F A7 CE 00 97 11 5E 45 C6 58 59 94 72 66 42 06 3F 72 3A B4 9E
//          OCTET STRING(4 byte) 8C 86 08 84
//      [0](3 elem)
//          OBJECT IDENTIFIER1.2.643.2.2.31.1
//          [0](2 elem)
//              SEQUENCE(2 elem)
//                  OBJECT IDENTIFIER1.2.643.2.2.19
//                  SEQUENCE(2 elem)
//                      OBJECT IDENTIFIER1.2.643.2.2.36.0
//                      OBJECT IDENTIFIER1.2.643.2.2.30.1
//              BIT STRING(1 elem)
//                  OCTET STRING(64 byte) 2D C3 FD F6 9C 91 3D CC B6 53 26 8E 51 2F 5E DD E4 1A 5D B3 58 3C DF 60 68 F2 48 A2 B0 B8 DE 7B C9 AA 20 E3 CF 63 DF 5F 39 55 21 E0 A0 DD 85 3E 0A AF 44 FA 49 3C D5 4C A8 04 8D 1D 9C 41 85 FB
//          OCTET STRING(8 byte) 76 EE B4 6B 1B 10 36 EB
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#include <wincrypt.h>
#include <tchar.h>
#else
#include <CSP_WinDef.h>
#include <CSP_WinCrypt.h>
#include "reader/tchar.h"
#endif
#include <WinCryptEx.h>

#define __CONTAINER_NAME__ "\\\\.\\HDIMAGE\\Test"

// ASN1 структура в DER кодировке, определяющая параметры открытого ключа
//
// SEQUENCE(2 elem)
//   OBJECT IDENTIFIER 1.2.643.2.2.36.0
//   OBJECT IDENTIFIER 1.2.643.2.2.30.1
BYTE bASN1GostR3410_94_PublicKeyParameters[] = {
    0x30, 0x12, // SEQUENCE (размер 0x12)

    0x06, 0x07, // OBJECT IDENTIFIER,  (размер 0x07)
    0x2A, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00, // 1.2.643.2.2.36.0

    0x06, 0x07, // OBJECT IDENTIFIER,  (размер 0x07)
    0x2A, 0x85, 0x03, 0x02, 0x02, 0x1E, 0x01  // 1.2.643.2.2.30.1
};

// ASN1 структура в DER кодировке, определяющая параметры
// алгоритма шифрования ГОСТ 28147-89
//
// SEQUENCE(1 elem)
//   OBJECT IDENTIFIER1.2.643.2.2.31.1
BYTE bEncryptionParamSet[] = {
    0x30, 0x09, // SEQUENCE (размер 0x09)
    0x06, 0x07, // OBJECT IDENTIFIER,  (размер 0x07)
    0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 // 1.2.643.2.2.31.1
};

int main(void)
{
    /* Разбираем ASN1 структуру */

    BYTE bUKM[] =
    {
        0x76, 0xEE, 0xB4, 0x6B, 0x1B, 0x10, 0x36, 0xEB
    };

    BYTE bEncryptedKey[] =
    {
        0x5E, 0x70, 0x73, 0x5F, 0x36, 0x98, 0xB4, 0x35, 0x5B, 0x45, 0x03, 0x7F, 0xA7, 0xCE, 0x00, 0x97,
        0x11, 0x5E, 0x45, 0xC6, 0x58, 0x59, 0x94, 0x72, 0x66, 0x42, 0x06, 0x3F, 0x72, 0x3A, 0xB4, 0x9E
    };

    BYTE bMacKey[] =
    {
        0x8C, 0x86, 0x08, 0x84
    };

    BYTE bEphemeralPublicKey[] =
    {
        0x2D, 0xC3, 0xFD, 0xF6, 0x9C, 0x91, 0x3D, 0xCC,
        0xB6, 0x53, 0x26, 0x8E, 0x51, 0x2F, 0x5E, 0xDD,
        0xE4, 0x1A, 0x5D, 0xB3, 0x58, 0x3C, 0xDF, 0x60,
        0x68, 0xF2, 0x48, 0xA2, 0xB0, 0xB8, 0xDE, 0x7B,

        0xC9, 0xAA, 0x20, 0xE3, 0xCF, 0x63, 0xDF, 0x5F,
        0x39, 0x55, 0x21, 0xE0, 0xA0, 0xDD, 0x85, 0x3E,
        0x0A, 0xAF, 0x44, 0xFA, 0x49, 0x3C, 0xD5, 0x4C,
        0xA8, 0x04, 0x8D, 0x1D, 0x9C, 0x41, 0x85, 0xFB
    };

    /* Собираем PUBLICKEYBLOB */
    BYTE bPublicKeyBlob[] =
    {
        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,
        // bPublicKey
        0x2D, 0xC3, 0xFD, 0xF6, 0x9C, 0x91, 0x3D, 0xCC,
        0xB6, 0x53, 0x26, 0x8E, 0x51, 0x2F, 0x5E, 0xDD,
        0xE4, 0x1A, 0x5D, 0xB3, 0x58, 0x3C, 0xDF, 0x60,
        0x68, 0xF2, 0x48, 0xA2, 0xB0, 0xB8, 0xDE, 0x7B,
        0xC9, 0xAA, 0x20, 0xE3, 0xCF, 0x63, 0xDF, 0x5F,
        0x39, 0x55, 0x21, 0xE0, 0xA0, 0xDD, 0x85, 0x3E,
        0x0A, 0xAF, 0x44, 0xFA, 0x49, 0x3C, 0xD5, 0x4C,
        0xA8, 0x04, 0x8D, 0x1D, 0x9C, 0x41, 0x85, 0xFB
    };

    /* Собираем SIMPLEBLOB */

    BYTE bSimpleBlob[] =
    {
        0x01, // bType = SIMPLEBLOB
        0x20, // bVersion = 0x20
        0x00, 0x00, // reserved
        0x23, 0x2e, 0x00, 0x00, // KeyAlg = ALG_SID_GR3410EL
        0x4d, 0x41, 0x47, 0x31, // Magic = GR3410_1_MAGIC
        0x1e, 0x66, 0x00, 0x00, // EncryptKeyAlgId = CALG_G28147
        0x76, 0xee, 0xb4, 0x6b, 0x1b, 0x10, 0x36, 0xeb, // bUKM
        // pbEncryptedKey
        0x5e, 0x70, 0x73, 0x5f, 0x36, 0x98, 0xb4, 0x35,
        0x5b, 0x45, 0x03, 0x7f, 0xa7, 0xce, 0x00, 0x97,
        0x11, 0x5e, 0x45, 0xc6, 0x58, 0x59, 0x94, 0x72,
        0x66, 0x42, 0x06, 0x3f, 0x72, 0x3a, 0xb4, 0x9e,
        0x8c, 0x86, 0x08, 0x84, // pbMacKey
        0x30, 0x09, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 // bEncryptionParamSet
    };

    HCRYPTPROV hProv        = NULL;
    HCRYPTKEY  hRespPubKey  = NULL;
    HCRYPTKEY  hUserKey     = NULL;
    HCRYPTKEY  hAgreeKey    = NULL;
    HCRYPTKEY  hKey         = NULL;

    //
    if(!CryptAcquireContext(&hProv, __CONTAINER_NAME__, NULL, PROV_GOST_2001_DH, 0))
    {
        printf("Error during CryptAcquireContext.\n");
        goto __exception;
    }

    // Импорт открытого ключа отправителя
    if(!CryptImportKey(hProv, &bPublicKeyBlob, sizeof(bPublicKeyBlob), 0, 0, &hRespPubKey))
    {
        printf("Ошибка при импорте открытого ключа отправителя (CryptImportKey).\n");
        goto __exception;
    }
    if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey))
    {
        printf("Error during CryptGetUserKey.\n");
        goto __exception;
    }

    // Согласование ключа обмена
    if(!CryptImportKey(hProv,&bPublicKeyBlob, sizeof(bPublicKeyBlob), hUserKey, 0, &hAgreeKey)){
        printf("Ошибка при согласовании ключей обмена (CryptImportKey).\n");
        goto __exception;
    }

    ALG_ID keyAlg = CALG_PRO_EXPORT;
    if(!CryptSetKeyParam(hAgreeKey, KP_ALGID, (LPBYTE)&keyAlg, 0))
    {
        printf("Error during CryptSetKeyParam.\n");
        goto __exception;
    }

    // Импорт зашифрованного ключа
    if(!CryptImportKey(hProv, &bSimpleBlob, sizeof(bSimpleBlob), hAgreeKey, CRYPT_EXPORTABLE, &hKey))
    {
        printf("Error during CryptImportKey session key.\n");
        goto __exception;
    }
    
    return 1;

    __exception:
        printf("Error number: 0x%x\n", GetLastError());
        if(hProv)
            CryptReleaseContext(hProv, 0);
        return -1;
}


Собрал вручную структуры PUBLICKEYBLOB и SIMPLEBLOB.
Все равно в момент импорта зашифрованного ключа выходит ошибка с кодом 0x80090005.
Код:

// Импорт зашифрованного ключа
if(!CryptImportKey(hProv, &bSimpleBlob, sizeof(bSimpleBlob), hAgreeKey, CRYPT_EXPORTABLE, &hKey))
{
    printf("Error during CryptImportKey session key.\n");
    goto __exception;
}


Подсажите, пожалуйста, в чем может быть проблема?
Offline unname  
#3 Оставлено : 23 мая 2017 г. 11:18:09(UTC)
unname

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

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

Цитата:

Код:
    BYTE bSimpleBlob[] =
    {
        0x01, // bType = SIMPLEBLOB
        0x20, // bVersion = 0x20
        0x00, 0x00, // reserved
        0x23, 0x2e, 0x00, 0x00, // KeyAlg = ALG_SID_GR3410EL
        0x4d, 0x41, 0x47, 0x31, // Magic = GR3410_1_MAGIC
        0x1e, 0x66, 0x00, 0x00, // EncryptKeyAlgId = CALG_G28147
        0x76, 0xee, 0xb4, 0x6b, 0x1b, 0x10, 0x36, 0xeb, // bUKM
        // pbEncryptedKey
        0x5e, 0x70, 0x73, 0x5f, 0x36, 0x98, 0xb4, 0x35,
        0x5b, 0x45, 0x03, 0x7f, 0xa7, 0xce, 0x00, 0x97,
        0x11, 0x5e, 0x45, 0xc6, 0x58, 0x59, 0x94, 0x72,
        0x66, 0x42, 0x06, 0x3f, 0x72, 0x3a, 0xb4, 0x9e,
        0x8c, 0x86, 0x08, 0x84, // pbMacKey
        0x30, 0x09, 0x06, 0x07, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1f, 0x01 // bEncryptionParamSet
    };



Полагаю в структуре должны указываться настройки ключа согласования.
Следующие значения исправляют ошибку:

Код:
KeyAlg = CALG_G28147;
Magic  = G28147_MAGIC;

Отредактировано пользователем 23 мая 2017 г. 11:18:41(UTC)  | Причина: Не указана

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