Вы должны уже иметь большие целые числа. Вот как это происходит для меня:
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
. Интерфейсы DSAPublicKey
и DSAParams
находятся в java.security.interfaces
.
Вы также можете выполнить KeyFactory
и использовать метод getKeySpec()
для экспорта открытого ключа в виде DSAPublicKeySpec
, который будет предлагать те же значения, что и экземпляры BigInteger
. Однако я не уверен, есть ли возможность пройти этот путь.
То, что вы показываете, это, вероятно, какая-то кодировка, но я не знаю, какая именно. В любом случае, параметр 'Q' должен иметь ширину не менее 160 бит в правильном открытом ключе DSA.