为什么用前导零填充模数?我正在阅读PKCS#1和PKCS#8,但没有找到任何有关它的信息。 在c#中必须删除前导零,有人知道为什么吗?ASN.1 DER格式化私钥
在http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html处,您可以看到模数和指数具有前导零。问题是他们为什么拥有它,我还没有在任何地方找到解释。
为什么用前导零填充模数?我正在阅读PKCS#1和PKCS#8,但没有找到任何有关它的信息。 在c#中必须删除前导零,有人知道为什么吗?ASN.1 DER格式化私钥
在http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html处,您可以看到模数和指数具有前导零。问题是他们为什么拥有它,我还没有在任何地方找到解释。
私钥值被编码为ASN.1 INTEGER,它们是二进制补码格式的有符号值。当(无符号)RSA密钥值的MSB被设置时,前导零字节是必需的。将MSB设置为不带前导零字节意味着负值。
ASN.1规范是免费的,链接从Wikipedia。这里的相关部分在X.690,“8.3整数值的编码”中。
我会在这里提供一个例子,以防链接页面消失。
如果你有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序列,长度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数据字节)
exponent1:0x7567 ... (不是必需的前导零字节,因为指数是< 2^255)
02 20 0a f6 3f ...
(32数据字节)
exponent2:0x0af6 ...
02 21 00 c7 13 ...
(33数据字节)
系数:0xc713 ...
你的答案是很好的解释。使用openssl来演示解释是有帮助的。 – 2011-05-25 16:37:33
注意整数ASN.1 DER样本可以用openssl很好地生成,例如,:'x = 128; openssl asn1parse -genstr“INTEGER:$ x”-noout -out data && hexdump -C data' – mykhal 2015-11-20 16:25:30