爲什麼用前導零填充模數?我正在閱讀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