Analisando o certificado x509 DSS para obter p, q, g e y
-
23-09-2019 - |
Pergunta
Estou tentando analisar um certificado X509 que contém um algoritmo público de assinatura digital (DSA).
Usando o método javax.security.cert.x509Certificate e getPublicKey (), consegui obter p, q, g e 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
No entanto, não tenho certeza de qual é o formato e como analisá -lo para convertê -lo em Long biginteger em Java.
Alguém sabe como fazer essa conversão?
Atualmente, estou assumindo que é hexadecimente e estou analisando -o como assim - mas não tenho 100% de certeza se isso está correto.
Obrigado, Dave
Solução
Você deve já tem os grandes números inteiros. Aqui está como é para mim:
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());
assumindo que o certificado codificado está em ecert
. Interfaces DSAPublicKey
e DSAParams
estão dentro java.security.interfaces
.
Você também pode passar por um KeyFactory
e use o getKeySpec()
método para exportar a chave pública como um DSAPublicKeySpec
, que oferecerá os mesmos valores que BigInteger
instâncias. Não tenho certeza se há um ganho para percorrer esse caminho.
O que você mostra é provavelmente algum tipo de codificação, mas estou sem saber qual deles. De qualquer forma, o parâmetro 'Q' terá pelo menos 160 bits de largura em uma chave pública adequada da DSA.