【问题标题】:Parsing X509 DSS Certificate to get P, Q, G and Y解析 X509 DSS 证书以获取 P、Q、G 和 Y
【发布时间】:2010-03-31 11:07:39
【问题描述】:

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

谢谢, 戴夫

【问题讨论】:

  • 家庭作业?这些参数非常弱,一定是有人故意选择的。

标签: cryptography parsing x509 dss


【解决方案1】:

您应该已经拥有大整数。这对我来说是这样的:

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 实例相同的值。不过,我不确定通过这条路是否有收获。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多