我目前开始使用DER (Distinguished Encoding Rules)编码,并且在理解整数的编码方面遇到了问题。
在参考文档https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf中,该编码定义如下:
8.3.1 整数值的编码应为原始的。内容八位组将由一个或多个八位组成。
8.3.2 如果整数值编码的内容八位组包含多个八位组,则第一个八位组和第二个八位组的第8位:
注意 - 这些规则确保整数值始终以最小可能数量的八位组进行编码。
8.3.3 内容八位组应为补码二进制数,等于整数值,并由第一个八位组的位8到1,第二个八位组的位8到1,以及依次每个八位组的位8到1,直到内容八位组的最后一个八位组。
在另一个网站https://learn.microsoft.com/en-us/windows/desktop/seccertenroll/about-integer上,解释了对于二进制以1开头的正数,需要在前面添加一个零字节。这也在stackoverflow上的一个旧问题的回答中提到:ASN Basic Encoding Rule of an integer。
不幸的是,从这些答案中我无法看出如何从参考文档的规则中推导出后一条指令。
例如,如果我想编码数字128,为什么不能像这样做:
[tag byte] [length byte] 10000000?
我知道正确的编码应该是[tag byte] [length byte] 00000000 10000000,但是以上变体违反了哪个条件?可能与二进制补码有关,但是128的二进制补码难道不是10000000吗?
我希望您能帮助我理解为什么Microsoft网站上的描述等同于原始定义。谢谢。
在参考文档https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf中,该编码定义如下:
8.3.1 整数值的编码应为原始的。内容八位组将由一个或多个八位组成。
8.3.2 如果整数值编码的内容八位组包含多个八位组,则第一个八位组和第二个八位组的第8位:
不应全部为1;和
不应全部为0。
8.3.3 内容八位组应为补码二进制数,等于整数值,并由第一个八位组的位8到1,第二个八位组的位8到1,以及依次每个八位组的位8到1,直到内容八位组的最后一个八位组。
在另一个网站https://learn.microsoft.com/en-us/windows/desktop/seccertenroll/about-integer上,解释了对于二进制以1开头的正数,需要在前面添加一个零字节。这也在stackoverflow上的一个旧问题的回答中提到:ASN Basic Encoding Rule of an integer。
不幸的是,从这些答案中我无法看出如何从参考文档的规则中推导出后一条指令。
例如,如果我想编码数字128,为什么不能像这样做:
[tag byte] [length byte] 10000000?
我知道正确的编码应该是[tag byte] [length byte] 00000000 10000000,但是以上变体违反了哪个条件?可能与二进制补码有关,但是128的二进制补码难道不是10000000吗?
我希望您能帮助我理解为什么Microsoft网站上的描述等同于原始定义。谢谢。