Cryptography 解析X509 DSS证书以获取P、Q、G和Y

Cryptography 解析X509 DSS证书以获取P、Q、G和Y,cryptography,parsing,x509,dss,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 4fa0671

我正在尝试解析包含数字签名算法(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%确定这是否正确

谢谢, Dave

你应该已经有了大整数了。我是这样想的:

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
中。接口
DSAPublicKey
DSAParams
位于
java.security.Interfaces

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


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

?这些参数非常微弱,一定是有人故意选择的。