Анализ сертификата X509 DSS для получения P, Q, G и Y
-
23-09-2019 - |
Вопрос
Я пытаюсь проанализировать сертификат X509, который содержит открытый ключ алгоритма цифровой подписи (DSA).
Используя класс 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, и я анализирую его как so - но я не уверен на 100%, правильно ли это.
Спасибо, Дэйв
Решение
Ты должен уже имейте большие целые числа.Вот как это происходит у меня:
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.