asn.1 - 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,
-- If present, 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 个完全不同的东西(规范和编码)。
后来通过所谓的自动标记解决了这个问题,但损坏已经造成。
推荐阅读
- c# - 如何通过linq对列表进行分组并在数据表中显示内部列表
- vba - 循环遍历充满 excel 文件的文件夹中的特定工作表并提取为 .csv
- python - 记录的重复数据删除
- python-3.x - Networkx 错误:“在 _not_implemented_for 术语中 = {'directed': graph.is_directed()}”
- php - Google 云打印无法转换为 PDF
- wordpress - 如何在转发器字段中动态填充复选框值
- c# - .NetCore 2.x 关于使用 {*catchAll} 路由 URL.Action 总是返回 null
- javascript - 单击外部时隐藏 Bootstrap 侧导航栏
- sql - 分区表上的 Postgres 查询比非分区表慢 2 倍
- excel - 通过vba在excel中打开邮件模板并用excel数据填充模板