ASN.1语法的“序列”中的数字是什么意思?

问题描述

这里是一个例子:

 TBSCertificate  ::=  SEQUENCE  {
     version         [0]  EXPLICIT Version DEFAULT v1,serialNumber         CertificateSerialNumber,signature            AlgorithmIdentifier,issuer               Name,validity             Validity,subject              Name,subjectPublicKeyInfo SubjectPublicKeyInfo,issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,-- If present,version must be v2 or v3
     subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,version must be v2 or v3
     extensions      [3]  EXPLICIT Extensions OPTIONAL
                          -- If present,version must be v3
     }

数字[0][1],……是什么意思,什么时候需要它们?缺少这样的数字意味着什么?

解决方法

它们被称为标签号,当使用TLV(标签长度值)形式(例如ASN.1基本编码)时,它们(连同后面的单词EXPLICIT或IMPLICIT一起用于编码/解码TBSCertificate值。规则)

您显示的文本称为规范并描述类型(TBSCertificate)。实际上,这只是规范的一部分,因为您缺少Version,CerficateSerialNumber等的定义。.

该规范是人类可读的文本。

在您要实例化值时,您必须知道将使用哪种编码(ASN.1定义了其中的一些二进制和文本格式)

最早的二进制编码称为基本编码规则,并使用TLV形式。

通常,作为用户,您不需要了解编码的详细信息。您应该使用根据规范创建一些代码的工具。

对我来说,在规范中允许使用标签是ASN.1开头就犯的一个巨大错误。它混合了2种完全不同的东西(规范和编码)。

后来通过所谓的AUTOMATIC标签解决了这一问题,但造成了损害。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...