Значение тега ASN.1 - PullRequest
       110

Значение тега ASN.1

0 голосов
/ 09 июля 2020

У меня есть тег со следующим значением: Tag(nr=16, typ=32, cls=0)

Что означает каждое из этих значений?

На основе https://en.wikipedia.org/wiki/X.690#Types, я думаю, наберите = 32 должно означать ВРЕМЯ-ДНЯ, но это не имеет смысла в моем контексте.

Так каков мой контекст? Рад, что ты спросил! Я распаковываю закрытый ключ ECDH_SECP256R1, созданный следующим образом:

>>> import asn1
>>> from Crypto.IO.PKCS8 import unwrap
>>> import binascii
>>> from CryptoMobile.EC import *
>>> ec_B = ECDH_SECP256R1()
>>> ec_B.get_privkey()
b'0\x81\x87\x02\x01\x000\x13\x06\x07*\x86H\xce=\x02\x01\x06\x08*\x86H\xce=\x03\x01\x07\x04m0k\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90'
>>> unwrap(ec_B.get_privkey())
('1.2.840.10045.2.1', b'0k\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90', b'\x06\x08*\x86H\xce=\x03\x01\x07')
>>> 
>>> 
>>> decoder = asn1.Decoder()
>>> decoder.start(unwrap(ec_B.get_privkey())[1])
>>> tag, value = decoder.read()
>>> tag
Tag(nr=16, typ=32, cls=0)
>>> value
b'\x02\x01\x01\x04 Wj\x80L\t\xc5\xa1oW\xd9\xbbFs{TH\xea\xe1*\x9a\x95\xf6\xe1\xd1\xe1\x9a%\xc8\xb7\xb3~h\xa1D\x03B\x00\x04\xf0T\xear^x\xb6\xa8\xe8\x04T \xf1\xbe\x81\xac\xba\xfdJ\xa10Y_\x0b\xb5^\x140\xaf\xa1S\x14|@\xfaV\x08\x15\x05Cr\xa7\xd1F\xcevq(H\x8a\x8d\xa2\xce\x84\xaa<\x0b>\xf5\xe0\xf1\xed\x9f\x90'

Я думаю, что этот тег говорит мне, как понять значение. А может, Python уже понял значение из тега? Это окончательное декодированное значение?

>>> print(binascii.hexlify(value))
b'0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90'

Или мне нужно использовать знание тега для его дальнейшего декодирования?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Обратите внимание, что в 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
}
0 голосов
/ 10 июля 2020

Тег 16 - это SEQUENCE или SEQUENCE OF. typ=32 предполагает, что бит 6 установлен в 1, поэтому ПОСЛЕДОВАТЕЛЬНОСТЬ находится в построенной форме. Фактически, в сообщениях криптографии SEQUENCE всегда используется в построенной форме. Я понятия не имею, что означает cls=0 (я не знаком с Python).

SEQUENCE - это структура с произвольными полями. SEQUENCE OF - это упорядоченный массив элементов одного типа (примитивных или построенных). Точный тип (SEQUENCE из SEQUENCE OF) определяется определением модуля ASN.1.

value в вашем случае является допустимым ECPrivateKey (согласно RF C 5915 ) структура, как определено ниже:

ECPrivateKey ::= SEQUENCE {
    version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey     OCTET STRING,
    parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
    publicKey  [1] BIT STRING OPTIONAL
}

и дамп в редакторе ASN.1:

введите описание изображения здесь

...