Анализ двоичных данных ASN.1 с помощью Java
У меня есть двоичные объекты данных ASN.1 Мне нужно проанализировать мой проект Java. Я просто хочу структуру и данные ASN.1, поскольку она анализируется, например, средством просмотра BER:
![ASN.1 structure as shown in BER viewer]()
Парсер ASN.1 BouncyCastle не способен анализировать эту структуру (возвращает только тип данных двоичного типа приложения).
Какую библиотеку ASN.1 можно использовать для получения такого результата? Кто-нибудь имеет пример кода, который демонстрирует, как разбирать объект ASN.1?
BTW: Я также пробовал несколько бесплатных компиляторов Java ASN.1, но ни один из них не может генерировать рабочий код Java, который может быть специфицирован ASN.1.
Ответы
Ответ 1
Я должен исправить себя - можно считывать данные, используя парсер ASN.1, включенный в BouncyCastle, - однако процесс не так прост.
Если вы хотите распечатать данные, содержащиеся в структуре ASN.1, я рекомендую вам использовать класс org.bouncycastle.asn1.util.ASN1Dump. Его можно использовать следующим простым фрагментом кода:
ASN1InputStream bIn = new ASN1InputStream(new ByteArrayInputStream(data));
ASN1Primitive obj = bIn.readObject();
System.out.println(ASN1Dump.dumpAsString(obj));
Он печатает структуру, но не данные, но, копируя ASN1Dump в собственный класс и изменяя его, чтобы распечатать, например OCTET_STRINGS, это можно сделать легко.
Кроме того, код в ASN1Dump демонстрирует синтаксический анализ структур ASN.1. Например, данные, используемые в моем вопросе, могут быть проанализированы на один уровень глубже, используя следующий код:
DERApplicationSpecific app = (DERApplicationSpecific) obj;
ASN1Sequence seq = (ASN1Sequence) app.getObject(BERTags.SEQUENCE);
Enumeration secEnum = seq.getObjects();
while (secEnum.hasMoreElements()) {
ASN1Primitive seqObj = (ASN1Primitive) secEnum.nextElement();
System.out.println(seqObj);
}
Ответ 2
Просто используйте "true" для печати значений
ASN1InputStream ais = new ASN1InputStream(
new FileInputStream(new File("d:/myfile.cdr")));
while (ais.available() > 0) {
ASN1Primitive obj = ais.readObject();
System.out.println(ASN1Dump.dumpAsString(obj, true));
}
ais.close();
Ответ 3
Из вашего вопроса неясно, есть ли у вас спецификация ASN.1 для BER, которую вы пытаетесь проанализировать. Обратите внимание, что без спецификации ASN.1 вы можете делать только частичное представление данных, если EXPLICIT TAGS использовались в спецификации ASN.1, из которой она была сгенерирована. Некоторые инструменты, такие как OSS Nokalva, имеют библиотеку (файл jar) под названием JIAAPI, которая позволяет вам перемещаться и управлять кодировками BER без предварительного знания спецификации ASN.1.
Если у вас есть спецификация ASN.1, любой компилятор Java ASN.1 должен иметь возможность справиться с этим.
Вы можете скачать бесплатную пробную версию OSS ASN.1 Tools for Java от http://www.oss.com/asn1/products/asn1-download.html, чтобы увидеть, работает ли для вас лучше, чем другие вы безуспешно пытались.
Ответ 4
Мне нужно иметь возможность анализировать любые данные ASN.1 в криптографии. Хотя крипт - это проект Ruby, вы можете взглянуть на расширение JRuby - код для обработки разбора/кодирования ASN.1 написан полностью на Java и достаточно модульной для легкого извлечения.
Я также сделал версию только для Java, но в ней отсутствуют некоторые из функций более высокого уровня первого. Но так как это лаконично, возможно, это хорошая возможность, чтобы вы начали.
Ответ 5
Если вы просто хотите декодировать BER-кодированные данные, там есть множество парсеров. Вы пробовали? В Sun JDK есть даже два - com.sun.jmx.snmp.BerDecoder и com.sun.jndi.ldap.BerDecoder.
Ответ 6
Я использую API-интерфейс bouncycastle для печати строковой структуры, ниже приведен фрагмент кода:
ASN1InputStream bIn = new ASN1InputStream(input);
DERObject obj = bIn.readObject();
System.out.println(CustomTreeNode.dumpAsString(obj));
В результате это структура печати, но в октетной строке это длина печати вместо значения.
Как напечатать значение?