ASN.1标签含义

2024-04-20 01:30:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个具有以下值的标记:Tag(nr=16, typ=32, cls=0)

这些价值观中的每一个都意味着什么

基于https://en.wikipedia.org/wiki/X.690#Types,我认为typ=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'

还是我必须使用标签的知识来进一步解码


Tags: importgetunwrapprivkeyecx04x01x02
2条回答

请注意,在ASN.1中,标记没有任何意义。。。它仅用于编码和解码数据(并且仅在BER、DER、CER编码规则中)

为了理解数据的含义,您始终需要ASN.1规范(ECPrivateKeyin@Crypt32 answer)

文件x.690中解释了编码和解码误码率的所有概念

对标签进行编码时(参见x.690文档中的8.1.2),需要3条信息:

  • 类别:通用、应用、上下文或专用
  • 基本/构造标志
  • 标签号

让我们以ECPrivateKey为例

  • 类是通用的('00'B),这是为规范(序列)提供的ASN.1类型保留的类
  • 标志被构造。因为序列是组件的容器
  • 标签号为16(由ASN.1提供)

那么,回到你的问题:

Tag(nr=16, typ=32, cls=0)

  • nr是标签号
  • typ是基本/构造标志
  • cls是这个班的学生

请注意,这些名称来自您正在使用的工具,而不是ASN.1词汇表

编辑:您提供的链接https://en.wikipedia.org/wiki/X.690#Types中对其进行了很好的总结

转到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

您可以看到您的值是version、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
}

标记16是SEQUENCESEQUENCE OFtyp=32表明位6被设置为1,所以序列是构造形式的。事实上,在密码学消息中,序列总是以构造形式使用。我不知道cls=0是什么意思(我不熟悉Python)

SEQUENCE是具有任意字段的结构SEQUENCE OF是相同类型(原语或构造的)元素的有序数组。{}的确切类型(SEQUENCE)由ASN.1模块定义确定

value在您的案例中是一个有效的ECPrivateKey(根据RFC 5915)结构,定义如下:

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

以及ASN.1编辑器中的转储:

enter image description here

相关问题 更多 >