1

我正在尝试解析包含数字签名算法 (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。

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

我目前假设它是十六进制,我正在解析它 - 但我不能 100% 确定这是否正确。

谢谢,戴夫

4

1 回答 1

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.

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

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

于 2010-03-31T12:57:57.010 回答