Parsing X509 DSS certificato arrivare P, Q, G e Y
-
23-09-2019 - |
Domanda
Sto cercando di analizzare un certificato X509 che contiene una firma digitale algoritmo a chiave pubblica (DSA).
Uso della classe javax.security.cert.X509Certificate e il metodo getPublicKey () sono stato in grado di ottenere 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
Tuttavia, non sono sicuro di quale formato questo è e come analizzare per convertirlo in lungo \ BigInteger in Java.
Qualcuno sa come fare questa conversione?
Al momento sto assumendo che sia Hex e sto parsing come così - ma non sono sicuro al 100% se questo è corretto
.Grazie, Dave
Soluzione
Si dovrebbe già avere i grandi numeri interi. Ecco come va per me:
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());
assumendo il certificato codificato è in ecert
. Interfacce DSAPublicKey
e DSAParams
sono in java.security.interfaces
.
Si può anche passare attraverso un KeyFactory
e utilizzare il metodo getKeySpec()
per esportare la chiave pubblica come DSAPublicKeySpec
, che offrirà gli stessi valori come istanze BigInteger
. Non sono sicuro se c'è un guadagno di passare attraverso quella strada, però.
ciò che si mostra è probabilmente un qualche tipo di codifica, ma sono abbastanza in perdita per sapere quale. In ogni caso, il parametro 'Q' deve essere almeno pari a 160 bit a livello in una vera e propria chiave pubblica DSA.