ASN.1 对象标识符值大于 128

kar*_*yzz 2 c# binary encoding cryptography asn.1

所以我理解当值小于 127 时值的编码方式。但是,在阅读https://docs.microsoft.com/en-us/windows/desktop/seccertenroll/about-object-identifier 后,我仍然不'不明白大于 128 的值是如何编码的。例如:

1.3.6.1.4.1.311.21.20 
Run Code Online (Sandbox Code Playgroud)

被编码为:

2b 06 01 04 01 82 37 15 14 
Run Code Online (Sandbox Code Playgroud)

怎么311编码成82 37?当您转换8237为十进制时,您会得到33335. 我真的不完全理解这部分。

pep*_*epo 5

这篇文章应该可以帮助你理解编码。

使用 7 位编码,第 8 位 (MSB) 用于指示编码结束。 82 37是二进制的10000010 00110111。您可以看到它由 2 个部分组成。第一部分的 MSB 设置为 1,但第二部分(本例中也是最后一个)的 MSB 设置为 0,表示编码结束。如果您解码(忽略第一部分的 MSB),它将是0000 0010 = 256 (2*128)+ 0011 0111 = 55 (2^0 + 2^1 + 2^2 + 2^4 + 2^5)=311