ASN.1 如何编码对象标识符?
我无法理解 ASN.1 的基本概念。
如果类型是 OID,相应的数字是否实际编码在二进制数据中?
例如在此定义中:
id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }
相应的 1.3.6.1.5.5.7.48.1 是否完全像这样编码在二进制文件中?
我问这个问题是因为我试图理解在 DER 文件(证书)中看到的特定值,即 04020500,但我不知道如何解释它。
I am having trouble understanding the basic concepts of ASN.1.
If a type is an OID, does the corresponding number get actually encoded in the binary data?
For instance in this definition:
id-ad-ocsp OBJECT IDENTIFIER ::= { id-ad 1 }
Does the corresponding 1.3.6.1.5.5.7.48.1 get encoded in the binary exactly like this?
I am asking this because I am trying to understand a specific value I see in a DER file (a certificate), which is 04020500, and I am not sure how to interpret it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
是的,OID 被编码在二进制数据中。您提到的 OID 1.3.6.1.5.5.7.48.1 变为 2b 06 01 05 05 07 30 01 (前两个数字以单个字节编码,所有剩余的数字也以单个字节编码,因为它们都是小于 128)。
此处。
但分析 ASN.1 数据的最佳方法是粘贴到在线解码器中,例如 http://lapo.it /asn1js/。
Yes, the OID is encoded in the binary data. The OID 1.3.6.1.5.5.7.48.1 you mention becomes 2b 06 01 05 05 07 30 01 (the first two numbers are encoded in a single byte, all remaining numbers are encoded in a single bytes as well because they're all smaller than 128).
A nice description of OID encoding is found here.
But the best way to analyze your ASN.1 data is to paste in into an online decoder, e.g. http://lapo.it/asn1js/.
如果所有数字都小于或等于 127,那么它们可以用一个八位位组表示。当您有较大的常见数字时,例如
1.2.840.113549.1.1.5 (sha1WithRsaEncryption)
,则使用可变长度解码。这些示例侧重于解码,但编码正好相反。1.前两个“数字”用单个字节表示
您可以通过将第一个字节读入整数进行解码
生成值
2。后续字节使用可变长度数量表示,也称为基数128。
VLQ 有两种形式,
短形式 - 如果八位字节以 0 开头,则使用剩余的 7 位简单地表示。
长格式 - 如果八位位组以 1(最高有效位)开头,则将该八位位组的接下来 7 位与每个后续八位位组的 7 位相结合,直到遇到最高有效位为 0 的八位位组(这标志着最后一个八位位组)。
值 840 将用以下两个字节表示,
BER 编码的绝佳资源,http: //luca.ntop.org/Teaching/Appunti/asn1.html
编辑/免责声明:
根据下面的评论修复了第一个八位字节,但尚未对此进行测试。我暂时保留此代码片段作为一般参考,但不能保证它是正确的,并且我不建议盲目复制和粘贴它:)。对于>128 VLQ,您通常会使用位移位来重新对齐位而不是位串。
If all your digits are less than or equal to 127 then you are they can be represented with a single octet each. When you have larger numbers which are common, such as
1.2.840.113549.1.1.5 (sha1WithRsaEncryption)
, then use it uses Variable Length Decoding. These examples focus on decoding, but encoding is just the opposite.1. First two 'digits' are represented with a single byte
You can decode by reading the first byte into an integer
Produces the values
2. Subsequent bytes are represented using Variable Length Quantity, also called base 128.
VLQ has two forms,
Short Form - If the octet starts with 0, then it is simply represented using the remaining 7 bits.
Long Form - If the octet starts with a 1 (most significant bit), combine the next 7 bits of that octet plus the 7 bits of each subsequent octet until you come across an octet with a 0 as the most significant bit (this marks the last octet).
The value 840 would be represented with the following two bytes,
Great resource for BER encoding, http://luca.ntop.org/Teaching/Appunti/asn1.html
EDIT / DISCLAIMER:
Fixed the first octet according to the comment below, but have not tested this. I'll leave this code snippet for now as a general reference, but it is not guaranteed to be correct and I do not recommend blindly copy and pasting it :). For >128 VLQ you would normally use bit-shifting to re-align the bits instead of a string of bits.
OID 编码傻瓜式 :) :
这是对 ITU-T 建议 X.690,第 8.19 章的重写>
OID encoding for dummies :) :
This is a rewording of ITU-T recommendation X.690, chapter 8.19
这是上述内容的简单 Python 3 实现。将对象标识符的字符串形式转换为 ASN.1 DER 或 BER 形式。
This is a simplistic Python 3 implementation of the of above, resp. a string form of an object identifier into ASN.1 DER or BER form.