ASN.1 / DER整数编码

问题描述 投票:2回答:1

我目前正在开始使用DER(可分辨编码规则)编码,并且在理解整数编码时遇到问题。

在参考文档https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf中,此编码定义如下:

8.3.1整数值的编码应该是原始的。内容八位字节应由一个或多个八位字节组成。

8.3.2如果整数值编码的内容八位字节由多个八位字节组成,则第一个八位字节的位和第二个八位字节的第8位:

  1. 不应该都是一个人;和
  2. 不应该都是零。

注 - 这些规则确保始终以尽可能小的八位字节数编码整数值。

8.3.3内容八位字节应为二进制补码二进制数,等于整数值,由第一个八位位组的第8位到第1位组成,后跟第二个八位位组的第8位到第1位,后跟第8位的每位八位字节依次包括内容八位字节的最后一个八位字节。

在另一个网站https://docs.microsoft.com/en-us/windows/desktop/seccertenroll/about-integer上,解释了对于二进制表示以1开头的正数,在前面添加了一个零字节。在stackoverflow的前一个问题的答案中也提到了这一点:ASN Basic Encoding Rule of an integer

不幸的是,从这些答案中我看不出后一条指令如何从参考文件的规则中推断出来。

例如,如果我想编码数字128,为什么我不能这样做

[标签字节] [长度字节] 10000000?

我知道正确的编码将是[标签字节] [长度字节] 00000000 10000000,但上述变量会损害哪种情况?可能它有两个补充的东西,但不是两个补充128再次10000000?

我希望你能帮助我理解为什么微软网站上的描述与原始定义相同。谢谢。

encoding asn.1 der
1个回答
0
投票

Two's complement规则(8.3.3)表示如果设置第一个(最低索引)内容字节的高位,则该数字为负数。

02 01 80的内容0b1000_0000。由于设置了高位,因此数字为负。

翻转所有位(0b0111_1111),然后添加一个:0b1000_0000;意思是它代表负128。

对于一个较不简单的例子,0b1000_0001 => 0b0111_1110 => 0b0111_1111,表明0x81为负127。

对于数字(正数)127,由于未设置高位,数字被解释为正数,因此内容只是0b0111_1111 aka 0x7F,导致02 01 7F

© www.soinside.com 2019 - 2024. All rights reserved.