ASN.1 SEQUENCE 标签号编码

Posted

技术标签:

【中文标题】ASN.1 SEQUENCE 标签号编码【英文标题】:ASN.1 SEQUENCE tag number encoding 【发布时间】:2018-07-03 05:07:44 【问题描述】:

根据例如http://luca.ntop.org/Teaching/Appunti/asn1.html,一个序列的十六进制标记号为10。 但是为什么它被 DER 编码为 30 而不是 10?十六进制标记号为 02 的 INTEGER 也编码为 02。 谢谢。

例如

Sample ::= SEQUENCE 
    number 5

编码为30 03 02 01 05

【问题讨论】:

【参考方案1】:

这是因为在 X.509 格式中,SETSEQUENCE 类型以构造形式使用。结果,第 6 位设置为 1。通过在第 6 位为SEQUENCE 通用标签 (0x10) 设置 1,您将获得 0x30 和 0x31 用于SET(0x11 和第 6 位为 1 = 0x31)。其余通用类型以原始形式编码(第 6 位设置为 0)。

【讨论】:

我还在为此苦苦挣扎。设置第六位不会使 SEQUENCE 为 0x14,而 SET 为 0x15 吗? 没有。第 6 位构造原始形式。通过清除该位,您可以恢复原始形式。 我要问的是,00010100(0x10 表示 SEQUENCE,第 6 位设置为表示构造)如何等于 0x31,而不是 0x14? 哦,对不起,我数错了。正如您所说,这是第 6 位设置:00110000,即 0x30。糟糕! 是的,位是按 RTL 方向计算的。

以上是关于ASN.1 SEQUENCE 标签号编码的主要内容,如果未能解决你的问题,请参考以下文章

ASN.1语法以及在python中如何编码解码

[转] DER编码和ASN.1

数字证书编码ASN.1

使用 asn.1 编码大整数时的奇怪之处

数字证书编码ASN.1

ASN.1笔记——标准编码规则BER