为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。在 c# 中必须删除前导零,有人知道为什么吗?
在http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html,您可以看到模数和指数有前导零。问题是他们为什么拥有它,我还没有在任何地方找到解释。
为什么模数用前导零填充?我正在阅读 PKCS#1 和 PKCS#8,但没有找到任何相关信息。在 c# 中必须删除前导零,有人知道为什么吗?
在http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html,您可以看到模数和指数有前导零。问题是他们为什么拥有它,我还没有在任何地方找到解释。
私钥值被编码为 ASN.1 INTEGER,它们是二进制补码格式的有符号值。当设置(无符号)RSA 密钥值的 MSB 时,前导零字节是必需的。设置没有前导零字节的 MSB 将意味着负值。
ASN.1 规范是免费的,链接自Wikipedia。这里的相关部分在 X.690,“8.3 Encoding of an integer value”中。
我将在此处提供一个示例,以防链接页面消失。
如果您有 openssl,您可以使用以下命令生成测试密钥:
openssl genrsa -out test.pem 512
openssl rsa -in test.pem -out test.der -outform der
以下是来自 test.der 的示例数据:
30 82 01 3b
ASN.1 SEQUENCE,长度 0x13b,内容如下
02 01 00
版本:ASN.1 INTEGER,存储长度 1,值 0
02 41 00 c0 8e ...
(65 个数据字节)
模数:ASN.1 INTEGER,存储长度 65,值 0xc08e...(需要前导零字节,因为模数 > 2^511)
02 03 01 00 01
公共指数:0x10001(不需要前导零字节,因为指数 < 2^23)
02 41 00 b5 87 ...
(65 个数据字节)
私有指数:0xb587...
02 21 00 e7 18 ...
(33 个数据字节)
prime1: 0xe718...
02 21 00 d5 43 ...
(33 个数据字节)
prime2: 0xd543...
02 20 75 67 a1 ...
(32 个数据字节)
指数 1:0x7567...(不需要前导零字节,因为指数 < 2^255)
02 20 0a f6 3f ...
(32 个数据字节)
指数 2:0x0af6...
02 21 00 c7 13 ...
(33个数据字节)
系数:0xc713...