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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top