我试图解析X509证书包含一个数字签名算法(DSA)公共密钥。

使用javax.security.cert.X509Certificate类和的getpublickey()方法我已经能够获得P,Q,G和Y:

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

不过,我不知道什么格式,这是如何解析它把它转换为长\ BigInteger的Java编写的。

没有任何人知道如何做到这一点的转换?

我目前假设它是十六进制和我解析它作为如此 - 但我不是100%肯定,如果这是正确的。

谢谢,    戴夫

有帮助吗?

解决方案

您应该的的有大的整数。这是怎么一回事呢我:

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实例。我不知道是否有增益要经过这条道路,虽然。

什么告诉你可能是某种编码的,但我很茫然地知道哪一个。无论如何,“Q”参数应至少为160位宽在一个适当的DSA公钥。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top