解析X509 DSS证书以获得P,Q,G和Y.

时间:2010-03-31 11:07:39

标签: cryptography parsing x509 dss

我正在尝试解析包含数字签名算法(DSA)公钥的X509证书。

使用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

但是,我不确定这是什么格式以及如何解析它以将其转换为Java中的long \ BigInteger。

有人知道如何进行此转换吗?

我目前假设它是Hex并且我正在解析它 - 但我不能100%确定这是否正确。

谢谢,    戴夫

1 个答案:

答案 0 :(得分: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。接口DSAPublicKeyDSAParams位于java.security.interfaces

您还可以浏览KeyFactory并使用getKeySpec()方法将公钥导出为DSAPublicKeySpec,它将提供与BigInteger个实例相同的值。不过,我不确定是否有收益可以通过这条道路。

你展示的可能是某种编码,但我很遗憾知道哪一种。无论如何,'Q'参数在适当的DSA公钥中至少应为160位宽。