INTEGER (证书注册 API)

整数值编码为 TLV 三元组,以 标记 值开头0x02。 TLV 三元组的 Value 字段包含编码的整数(如果为正数)或其两个的补数(如果为负数)。 如果整数为正数,但高阶位设置为 1,则会将前导0x00添加到内容中,以指示数字不是负数。 例如,0x8F (10001111) 的高阶字节为 1。 因此,将前导零字节添加到内容,如下图所示。

der encoding of boolean data type

如果整数包含的字节少于 128 字节,则 Length 字段只需要一个字节才能指定内容长度。 如果整数超过 127 字节,则 长度 字段的位 7 设置为 1,位 6 到 0 指定用于标识内容长度的其他字节数。 有关详细信息,请参阅 编码的长度和值字节

以下示例来自 PKCS #10 编码 ASN.1,显示 128 字节公钥的编码。 第一个字节包含 INTEGER 数据类型的标记值,0x02。 第二个和第三个字节包含 Length 值。 第二个字节中的第 7 位设置为 1,因为内容超过 127 字节。 第二个字节中的位 0 到 6 指定所需的尾随字节数,在本例中为准确指定内容长度。 第三个字节指定内容字节数,0x81。 第四个字节(0x00)将添加到内容中,以指示整数确实是正值,即使前导内容字节的符号位 (0x8F) 设置为 1。

02 81 81          ; INTEGER (81 Bytes)
|  00
|  8f e2 41 2a 08 e8 51 a8  8c b3 e8 53 e7 d5 49 50
|  b3 27 8a 2b cb ea b5 42  73 ea 02 57 cc 65 33 ee
|  88 20 61 a1 17 56 c1 24  18 e3 a8 08 d3 be d9 31
|  f3 37 0b 94 b8 cc 43 08  0b 70 24 f7 9c b1 8d 5d
|  d6 6d 82 d0 54 09 84 f8  9f 97 01 75 05 9c 89 d4
|  d5 c9 1e c9 13 d7 2a 6b  30 91 19 d6 d4 42 e0 c4
|  9d 7c 92 71 e1 b2 2f 5c  8d ee f0 f1 17 1e d2 5f
|  31 5b b1 9c bc 20 55 bf  3a 37 42 45 75 dc 90 65

以下示例演示如何对整数值进行编码0x03。 Tag 字节包含0x02,长度字节指定有一个字节的内容。

02 01             ; INTEGER (1 Bytes)
|  03

ASN.1 类型系统

ASN.1 类型的 DER 编码