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 に変換するために解析する方法がわかりません。

誰もこの変換を行う方法を知っていますか?

私は現在、それが Hex であると想定しており、そのように解析していますが、これが正しいかどうかは 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ます。インターフェイスDSAPublicKeyDSAParamsは にありjava.security.interfacesます。

また、 を通過しKeyFactory、 メソッドを使用しgetKeySpec()て公開鍵を としてエクスポートすることもできます。DSAPublicKeySpecこれにより、インスタンスと同じ値が提供されBigIntegerます。ただ、その道を行くメリットがあるかどうかはわかりません。

あなたが示しているのはおそらくある種のエンコーディングですが、私はどれがどれかを知るのにかなり途方に暮れています. とにかく、「Q」パラメータは、適切な DSA 公開鍵で少なくとも 160 ビット幅でなければなりません。

于 2010-03-31T12:57:57.010 に答える