Статус: Участник
Группы: Участники
Зарегистрирован: 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;
}
Подсажите, пожалуйста, в чем может быть проблема?
|