2010-03-31 141 views
1

我正試圖解析包含數字簽名算法(DSA)公鑰的X509證書。解析X509 DSS證書以獲得P,Q,G和Y

使用,我已經能夠得到P,Q,G和Y的javax.security.cert.X509Certificate類的getpublickey()方法:

P: 0279b05d bd36b49a 6c6bfb2d 2e43da26 052ee59d f7b5ff38 f8288907 2f2a5d8e 2acad76e ec8c343e eb96edee 11 
Q: 036de1 
G: 03 
Y: 02790a25 22838207 4fa06715 1def9df5 474b5d84 a28b2b9b 360a7fc9 086fb2c6 9aab148f e8372ab8 66705884 6d 

但是,我不知道是什麼格式這是如何解析它並將其轉換爲Java中的long \ BigInteger。

有沒有人知道如何做這種轉換?

我目前假設它是十六進制,我解析它 - 但我不是100%確定這是否正確。

謝謝, 戴夫

+0

作業?這些參數非常微弱,以至於有人必須故意選擇它們。 – abc 2010-04-01 09:28:12

回答

2

你應該已經有大的整數。下面是它對我的影響:

X509Certificate xc = X509Certificate.getInstance(ecert); 
PublicKey pkey = xc.getPublicKey(); 
DSAPublicKey dk = (DSAPublicKey)pkey; 
DSAParams pp = dk.getParams(); 
System.out.printf("p = 0x%X\n", pp.getP()); 
System.out.printf("q = 0x%X\n", pp.getQ()); 
System.out.printf("g = 0x%X\n", pp.getG()); 
System.out.printf("y = 0x%X\n", dk.getY()); 

假設編碼證書在ecert。接口DSAPublicKeyDSAParamsjava.security.interfaces

你也可以去通過KeyFactory並使用getKeySpec()方法將公共密鑰導出爲DSAPublicKeySpec,這將提供相同的值BigInteger實例。不過,我不確定是否有收益。

你顯示的可能是某種編碼,但我很難知道哪一個。無論如何,在適當的DSA公鑰中,'Q'參數至少應爲160位寬。

+0

謝謝托馬斯 - 這對我有效 – 2010-03-31 13:23:34