Возьмем для примера результат работы функции CryptExportKey(hKey,0,PUBLICKEYBLOB,0,pbKeyBlob,&dwBlobLen) с моими комментариями:
BYTE pbKeyBlob[]={
0x06, // bType = PUBLICKEYBLOB
0x20, // bVersion = 0x20
0x00,0x00, // reserved
0x23,0x2E,0x00,0x00, // KeyAlg = ALG_SID_GR3410EL
0x4D,0x41,0x47,0x31, // Magic = MAG1
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
0xE5,0x8E,0x60,0x9E,0x9A,0x8E,0xEE,0x03,0xD0,0xE6,0x2B,0xDD,0x56,0xDC,0x5A,0x17,
0x8F,0x06,0x14,0xA5,0x78,0xF3,0x71,0x75,0xE1,0x47,0xA7,0x8C,0xF3,0xD2,0x7E,0x7B,
0x77,0x05,0x26,0xE1,0x58,0xDC,0x55,0x33,0x06,0x78,0x31,0xF7,0xCF,0x5B,0x29,0x2E,
0x2E,0x44,0x3E,0x20,0xD4,0xED,0x4B,0x1C,0xB3,0xC3,0xE8,0x40,0xE8,0x09,0xE4,0x81
};
Если я правильно понимаю, то открытый ключ - это должны быть последние 64 байта.
И этот блок успешно импортируется функцией CryptImportKey(hCryptProv,pbKeyBlob,dwBlobLen,0,CRYPT_EXPORTABLE,&hKey).
Но стоит поменять эти 64 байта на открытый ключ, полученный не от КриптоПро (но тоже от криптобиблиотеки с сертификатом ФСБ),
функция будет возвращать ошибку NTE_BAD_DATA.
И если для расчета хэша параметры методом экспериментов подобрать удалось, то с ключами как-то вообще никак...