2010-03-31 6 views
1

Я пытаюсь разобрать сертификат X509, содержащий открытый ключ алгоритма цифровой подписи (DSA).Parsing X509 DSS Certificate для получения P, Q, G и Y

Использование класса 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 

Однако, я не уверен, какой формат это и как разобрать его, чтобы преобразовать его в long \ BigInteger в Java.

Кто-нибудь знает, как сделать это преобразование?

В настоящее время я предполагаю, что это Hex, и я разбираю его как это - но я не уверен на 100%, если это правильно.

Спасибо, Dave

+0

Домашнее задание? Эти параметры настолько крайне слабы, что кто-то должен их сознательно выбирать. – abc

ответ

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. Интерфейсы DSAPublicKey и DSAParams находятся в java.security.interfaces.

Вы также можете пройти через KeyFactory и использовать метод getKeySpec() экспортировать открытый ключ в качестве DSAPublicKeySpec, который будет предлагать то же значение, BigInteger экземпляров. Однако я не уверен, есть ли возможность пройти через эту дорогу.

То, что вы показываете, вероятно, является своего рода кодировкой, но я совершенно не понимаю, какой из них. Во всяком случае, параметр «Q» должен быть не менее 160 бит в собственном открытом ключе DSA.

+0

Спасибо Томас - это сработало для меня –