首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASN.1标签含义

ASN.1标签含义
EN

Stack Overflow用户
提问于 2020-07-10 03:14:00
回答 2查看 418关注 0票数 0

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

这些值中的每一个意味着什么?

基于https://en.wikipedia.org/wiki/X.690#Types,我认为typ=32应该是一天中的时间,但这在我的上下文中没有意义。

那么我的背景是什么呢?我很高兴你这么问!我正在解压使用以下内容创建的ECDH_SECP256R1私钥:

代码语言:javascript
复制
>>> 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已经理解了标签中的值?这是最终的解码值吗?

代码语言:javascript
复制
>>> print(binascii.hexlify(value))
b'0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90'

或者我必须使用标签的知识来进一步解码它?

EN

回答 2

Stack Overflow用户

发布于 2020-07-10 17:09:10

请注意,在ASN.1中,标记没有任何意义...它只是用来对数据进行编码和解码(并且只在BER,DER,CER编码规则中使用)

为了理解数据的含义,您总是需要ASN.1规范( @Crypt32 answer中的ECPrivateKey)

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

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

标记类:通用、应用、上下文或专用标记原始/构造标志

  • tag number

让我们以ECPrivateKey为例。

SEQUENCE number类是通用的('00'B),这是为ASN.1保留的类。1由spec (SEQUENCE)

  • Flag提供的类型被构造。因为一个序列是一个容器,编号为16 (由ASN.1.1提供)

所以,回到你的问题上:

标签(nr=16、typ=32、cls=0)

  • nr是标签号

是原语/构造标志

  • cls是类

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

编辑:实际上在您提供的https://en.wikipedia.org/wiki/X.690#Types链接中已经做了很好的总结

转到https://asn1.io/asn1playground/并编译以下规范...

代码语言:javascript
复制
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个字节的序列

代码语言:javascript
复制
306B0201010420576a804c09c5a16f57d9bb46737b5448eae12a9a95f6e1d1e19a25c8b7b37e68a14403420004f054ea725e78b6a8e8045420f1be81acbafd4aa130595f0bb55e1430afa153147c40fa560815054372a7d146ce767128488a8da2ce84aa3c0b3ef5e0f1ed9f90

您可以看到,您的值是一系列的版本、privateKey和publicKey (缺少可选参数)

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2020-07-10 15:51:03

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

SEQUENCE是一个具有任意字段的结构。SEQUENCE OF是相同类型(原始或构造)的元素的有序数组。具体类型(SEQUENCE OFSEQUENCE)由ASN.1模块定义决定。

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

代码语言:javascript
复制
ECPrivateKey ::= SEQUENCE {
    version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey     OCTET STRING,
    parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
    publicKey  [1] BIT STRING OPTIONAL
}

和ASN.1编辑器中的转储:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62822071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档