Обратите внимание, что в ASN.1 тег не имеет значения ... он просто используется для кодирования и декодирования данных (и только в правилах кодирования BER, DER, CER)
Чтобы иметь значение данных, вам всегда нужна спецификация ASN.1 (ECPrivateKey
в ответе @ Crypt32)
Вся концепция кодирования и декодирования BER объясняется в документе x.690
Когда вы закодируйте тег (см. 8.1.2 в x.690 do c), вам потребуется 3 части информации:
- Класс: Универсальный, Приложение, Контекст или Частный
- Примитивный / сконструированный флаг
- Номер тега
Возьмем ECPrivateKey
...
- Класс универсальный ('00'B), который - это класс, зарезервированный для типов ASN.1, предоставляемых spe c (SEQUENCE)
- Флаг создан. Поскольку ПОСЛЕДОВАТЕЛЬНОСТЬ - это контейнер компонентов
- Номер тега - 16 (предоставляется ASN.1)
Итак, вернемся к вашему вопросу:
Тег (nr = 16, typ = 32, cls = 0)
- nr - номер тега
- typ - примитивный / сконструированный флаг
- cls - это класс
Обратите внимание, что имена взяты из используемого вами инструмента, а не из словаря ASN.1
РЕДАКТИРОВАТЬ: это на самом деле хорошо резюмировано в предоставленной вами ссылке https://en.wikipedia.org/wiki/X.690#Types
Go до https://asn1.io/asn1playground/ и скомпилировать следующую спецификацию ...
Example DEFINITIONS EXPLICIT TAGS ::=
BEGIN
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
-- parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, --
publicKey [1] BIT STRING OPTIONAL
}
END
Расшифровать следующее значение (я просто поставил 306B перед вашим значением) ... что означает ПОСЛЕДОВАТЕЛЬНОСТЬ из 107 байт
306B0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90
Вы видите, что ваше значение представляет собой последовательность версии, privateKey и publicKey (необязательные параметры отсутствуют)
ECPrivateKey SEQUENCE: tag = [UNIVERSAL 16] constructed; length = 107
version INTEGER: tag = [UNIVERSAL 2] primitive; length = 1
1
privateKey OCTET STRING: tag = [UNIVERSAL 4] primitive; length = 32
0x576a804c09c5a16f57d9bb46737b5448ea ...
publicKey : tag = [1] constructed; length = 68
BIT STRING: tag = [UNIVERSAL 3] primitive; length = 66
0x0004f054ea725e78b6a8e8045420f1be81 ...
Successfully decoded 109 bytes.
rec1value ECPrivateKey ::=
{
version ecPrivkeyVer1,
privateKey '576A804C09C5A16F57D9BB46737B5448EA ...'H,
publicKey '00000100 11110000 01010100 11101010 011 ...'B
}