24.03.2007 14:33:17проблема при декодировании открытого ключа Ответов: 1
Александр
При получении открытого ключа из сертификата он почему-то отображается некорректно, а именно, вместо первых двух байтов
отображаются какие-то левые, оставшаяся часть отображается нормально.

Исходный открытый ключ:
04 40 82 f9 53 28 81 47 a7 35 36 61 b5 81 d5 3f 8e b6 a1 cf d5 7c 05 ba 8c ac 1f 94 54 16 c6 8c 63 7c 14 bf e4 48 9a 0b 87
d1 d6 59 70 bc 13 2a 31 42 56 65 62 da 6a fb 34 f3 2f 5f 07 94 d3 f9 6e 5a

Ключ полученный при декодировании:
40 00 00 00 98 6A 89 00 82 F9 53 28 81 47 A7 35 36 61 B5 81 D5 3F 8E B6 A1 CF D5 7C 05 BA 8C AC 1F 94 54 16 C6 8C 63
7C 14 BF E4 48 9A 0B 87 D1 D6 59 70 BC 13 2A 31 42 56 65 62 DA 6A FB 34 F3 2F 5F 07 94 D3 F9 6E 5A

Может неверная константа lpszStructType? или все дело в unusedBits?
В чем может быть проблема? Кусок исходника приведен ниже.
Кстати, почему ключ ГОСТ 34.10-2001 состоит из 66 байт, а не 64 (512 бит)?


Заранее благодарен.

---------------------------

SelectedCertContext - контекст сертификата
dwCertSize - размер декодируемой структуры


if ( !CryptDecodeObject ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
szOID_SUBJECT_KEY_IDENTIFIER,
SelectedCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData,
SelectedCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData,
0, NULL, &dwCertSize ))

{
// error
}

publickeyblob = (byte *)malloc(dwCertSize);

if ( !CryptDecodeObject ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
szOID_SUBJECT_KEY_IDENTIFIER,
SelectedCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.pbData,
SelectedCertContext->pCertInfo->SubjectPublicKeyInfo.PublicKey.cbData, 0, publickeyblob, &dwCertSize ))
{

//error
}

char *size = new char[(dwCertSize *2)+1];

ByteToStr(dwCertSize,publickeyblob,size);
 
Ответы:
29.03.2007 2:37:50Serge3leo
Здравствуйте,

> Может неверная константа lpszStructType? или все дело в unusedBits?
> В чем может быть проблема?
Вероятно, одна из проблем в том, что Вы неверно выбрали использование szOID_SUBJECT_KEY_IDENTIFIER (это OID раширения X.509 с идентификатор ключа).

> Кстати, почему ключ ГОСТ 34.10-2001 состоит из 66 байт, а не 64 (512 бит)?
Потому что он, согласно традиции, инкапсулирован ещё и в OCTET STRING.
Подробности и примеры смотрите в RFC 4491 <http://tools.ietf.org/html/rfc4491> и RFC 3280 <http://tools.ietf.org/html/rfc3280>