【问题标题】:ASN.1 tag meaningASN.1标签含义
【发布时间】:2020-07-09 19:14:00
【问题描述】:

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

每个值的含义是什么?

基于https://en.wikipedia.org/wiki/X.690#Types,我认为 typ=32 应该表示 TIME-OF-DAY,但这在我的上下文中没有意义。

那么我的上下文是什么?我很高兴你问!我正在解压缩使用以下内容创建的 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'

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

【问题讨论】:

    标签: python tags asn.1


    【解决方案1】:

    注意,在ASN.1中,标签没有任何意义……它只是用来编码和解码数据(并且只在BER、DER、CER编码规则中)

    要了解数据的含义,您始终需要 ASN.1 规范(@Crypt32 答案中的ECPrivateKey

    编码和解码BER的所有概念在文档x.690中进行了解释

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

    • 类:通用、应用程序、上下文或私有
    • 原始/构造标志
    • 标签号

    让我们以ECPrivateKey ...

    • Class is Universal ('00'B) 这是为规范 (SEQUENCE) 提供的 ASN.1 类型保留的类
    • 标志已构建。因为 SEQUENCE 是组件的容器
    • 标签号为 16(由 ASN.1 提供)

    那么,回到你的问题:

    标签(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
    }
    

    【讨论】:

    • 感谢您的回复。我需要一些时间让一切都沉浸在其中。
    【解决方案2】:

    标签 16 是 SEQUENCESEQUENCE OFtyp=32 建议将第 6 位设置为 1,因此 SEQUENCE 是构造形式。事实上,在密码学消息中,SEQUENCE 总是以构造形式使用。我不知道cls=0 是什么意思(我不熟悉 Python)。

    SEQUENCE 是一个具有任意字段的结构。 SEQUENCE OF 是相同类型(原始或构造)元素的有序数组。确切类型(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 编辑器中的转储:

    【讨论】:

    • 感谢您的回复。我需要一些时间让一切都沉浸在其中。
    猜你喜欢
    • 2020-09-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2021-07-30
    相关资源
    最近更新 更多