我有一个包含 RSA 公钥的证书请求。看起来模数部分本身就是公钥。但根据我的理解,它必须包含 256 个字节,而模数部分包含 257 个 1。我应该省略第一个 00 字节吗?
为什么公钥位于模数中,指数又是什么?
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = US, ST = California, L = San Fransisco, O = MLopsHub, OU = MlopsHub Dev, CN = www.aaa.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:bd:57:66:25:c2:b1:15:05:3f:84:ee:c4:f7:38:
81:21:b1:ea:45:17:93:88:ec:f2:47:14:3a:fe:c5:
37:33:a9:03:35:5a:28:a1:de:f8:27:31:b3:01:cb:
16:ef:d8:0b:7a:4e:da:66:11:e1:47:4d:49:85:1d:
06:d1:66:48:34:aa:7b:a2:7c:34:d9:13:d1:91:95:
15:e7:d4:b1:d4:7c:ce:65:21:1c:78:6e:dd:3e:ba:
71:4e:f7:6a:93:d0:6c:3b:8c:05:98:e6:12:b6:c1:
e7:b6:1a:f3:dd:db:89:12:ba:6e:f7:28:0a:d9:a8:
1b:1f:21:17:2d:25:80:20:6a:dd:7c:9f:0b:25:a6:
2a:a0:ac:d9:19:85:75:65:93:93:9c:c0:e8:ec:db:
94:fd:37:ca:f3:66:5f:c0:0c:a2:24:eb:6d:e3:a6:
24:89:56:10:89:95:e0:cf:e8:27:fd:df:2b:4b:ce:
1d:43:38:2b:4f:ed:63:96:18:ef:69:e2:f5:84:39:
70:10:38:42:c6:a5:a0:ad:1c:be:06:ca:bb:f4:50:
21:22:38:b5:7c:6a:d3:58:9b:a3:44:ed:7d:39:52:
9d:c4:77:fc:5f:59:a1:b4:9e:f1:93:88:74:01:44:
f3:b4:40:b3:03:32:93:27:dd:54:c0:fd:bb:6d:91:
fc:c3
Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha256WithRSAEncryption
56:42:65:6b:78:24:3e:3d:f1:01:c5:7e:a1:bd:ef:f9:79:3c:
dc:e1:66:24:75:43:4b:d5:86:77:d8:0c:cd:57:a2:89:13:fe:
96:e8:f2:a2:ae:81:6d:99:82:28:1b:4d:70:c7:e8:f5:1f:8d:
16:86:4b:87:d9:f3:61:0e:d7:e1:34:89:f3:ba:fc:28:6b:94:
55:89:8a:46:33:2e:51:c3:05:bf:35:c7:06:61:5e:ab:9a:45:
7c:ae:07:61:8d:85:8c:9d:ec:0c:6c:60:17:53:f7:ce:f1:e8:
30:c5:ee:7e:f9:ed:a0:ae:44:44:0e:6c:47:26:89:7e:93:0a:
c9:ec:45:ec:38:a0:1f:9e:a7:3e:63:0b:d7:a0:ec:b5:1a:ee:
07:6f:9f:29:e7:f4:70:ef:1d:98:3d:5c:61:6b:4a:19:de:b7:
bf:0f:98:4f:62:25:85:19:73:1d:02:ab:a0:e7:a7:6e:d8:b0:
79:90:a0:bd:41:8e:68:d3:71:4d:6e:60:52:16:7e:37:91:b1:
19:8b:26:f9:33:df:38:b5:a8:51:8d:40:ee:82:04:e8:dd:23:
9a:72:1e:4d:cc:db:b1:31:e0:6f:40:00:03:9c:af:da:62:5b:
85:d9:82:7e:3a:6f:a5:9f:37:0c:24:b1:cb:c8:36:b0:b5:2c:
37:2f:8c:9e
答案1
为什么公钥位于模数中,指数又是什么?
这是字面上地模数。看一下RSA加密过程– 它涉及一个数学公式,n是“模数”值,埃是“指数”。
与(大多数)对称密码(其密钥只是位串)不同,常见的非对称密码通常使用实际数值作为某些数学表达式的一部分。因此,您不应该只寻找“看起来像密钥”的大型十六进制转储 - 相同的模数值也可以用十进制表示,就像指数一样。
请注意,在大多数情况下,你需要同时使用模量和指数作为您的“公钥”(除非事先约定始终使用标准指数,例如 65537)。在 PKI 证书中,整个“主体公钥信息”结构(而不仅仅是模数字段)都是公钥。
但根据我的理解,它必须包含 256 个字节,而模数部分包含 257 个 1。我应该省略第一个 00 字节吗?
在 X.509 证书中,模数存储为“INTEGER”ASN.1 类型(因为它实际上是一个整数,而不仅仅是一系列字节)。此数据类型保存任意长度的有符号整数。
由于值存储为签整数,第一个字节的最高位表示数字是正数还是负数。但是您示例中的模数(0xbd57...)恰好已经设置了其最高位,因此根据 ASN.1 DER 格式规则,它必须以 0x00 字节为前缀进行存储,以确保它不会被误解为负数。
因为它仍然是一个数字,所以额外的 0x00 前缀不会改变值的含义(就像“000123”仍然是十进制数“123”一样)。无论你能是否省略它取决于您如何使用该值。例如,当将其指定为整数文字(modulus = 0xbd5766..
)时,可以省略它,因为负值将用减号表示 - 但保留它也不会有什么坏处。但是,如果您通过某种“byte[] to bigint”函数运行该值,则可能需要保留前缀。