ASN.1 DER格式的私钥

12
为什么要在模数前填充前导零?我正在阅读PKCS#1和PKCS#8,但没有找到相关说明。在C#中,必须删除前导零,请问有谁知道为什么?
http://etherhack.co.uk/asymmetric/docs/rsa_key_breakdown.html上,您可以看到模数和指数都有前导零。问题是为什么要这样做?我还没有找到任何解释。
1个回答

25

私钥值被编码为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 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个数据字节)
素数1:0xe718...

02 21 00 d5 43 ...(33个数据字节)
素数2: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...


你的回答解释得非常好。使用openssl来演示说明是有帮助的。 - this.josh
请注意,可以使用openssl轻松生成整数ASN.1 DER样本,例如:x=128; openssl asn1parse -genstr "INTEGER:$x" -noout -out data && hexdump -C data - mykhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接